Just had a thought and looked a tiny bit at the source code to assess feasibility, but it seems like you could just derive the DAG class and override `previous_schedule` and `following_schedule` methods. The signature of both is you get a `datetime.datetime` and have to return another. It's pretty easy to put your arbitrarily complex logic in there.
There may be a few hiccups to sort out things like like `airflow.utils.dates.date_range` (where duplicated time-step logic exist) to make sure that all time-step logic aligns with these two methods I just mentioned, but from that point it could be become the official way to incorporate funky date-step logic. Max On Wed, Sep 4, 2019 at 12:54 PM Daniel Standish <dpstand...@gmail.com> wrote: > Re: > > > For example, if I need to run a DAG every 20 minutes between 8 AM and 4 > > PM... > > > This makes a lot of sense! Thank you for providing this example. My > initial thought of course is "well can't you just set it to run */20 > between 7:40am and 3:40pm," but I don't think that is possible in cron. > Which is why you have to do hacky shit as you've said and it indeed sounds > terrible. I never had to achieve a schedule like this, and yeah -- it > should not be this hard. > > Re: > > > I can’t see how adding a property to Dagrun that is essentially > > identical to next_execution_date would add any benefit. > > That's why i was like what the hell is the point of this thing! I thought > it was just purely cosmetic, so that in effect "execution_date" would > optionally mean "run_date". > > > > > > > > On Wed, Sep 4, 2019 at 12:10 PM James Coder <jcode...@gmail.com> wrote: > > > I can’t see how adding a property to Dagrun that is essentially > > identical to next_execution_date would add any benefit. The way I see > > it the issue at hand here is not the availability of dates. There are > > plenty of options in the template context for dates before and after > > execution date. My view point is the problem this is trying to solve > > is that waiting until the right edge of an interval has passed to > > schedule a dag run has some shortcomings. Mainly that if your > > intervals vary in length you are forced to put scheduling logic that > > should reside in the scheduler in your DAGs. For example, if I need to > > run a DAG every 20 minutes between 8 AM and 4 PM, in it's current > > form, the scheduler won't schedule that 4PM run until 8 AM the next > > day. "Just use next_execution_date" you say, well that's all well and > > good between 8AM and 3:40 PM, but when 4:01 PM rolls around and you > > don't have the results because they won't be available until after 8 > > the next day, that doesn't sound so good, does it? In order to work > > around this, you have to add additional runs and short circuit > > operators over and over. It's a hassle. Allowing for scheduling dags > > at the left edge of an interval and allowing it to behave more like > > cron, where it runs at the time specified, not schedule + interval, > > would make things much less complicated for users like myself that > > can't always wait until the right edge of the interval. > > > > > > James Coder > > > > > On Sep 3, 2019, at 11:14 PM, Daniel Standish <dpstand...@gmail.com> > > wrote: > > > > > > What if we merely add a property "run_date" to DagRun? At present > > > this would be essentially same as "next_execution_date". > > > > > > Then no change to scheduler would be required, and no new dag parameter > > or > > > config. Perhaps you could add a toggle to the DAGs UI view that lets > you > > > choose whether to display "last run" by "run_date" or "execution_date". > > > > > > If you want your dags to be parameterized by the date when they meant > to > > be > > > run -- as opposed to their implicit interval-of-interest -- then you > can > > > reference "run_date". > > > > > > One potential source of confusion with this is backfilling: what does > > > "run_date" mean in the context of a backfill? You could say it means > > > essentially "initial run date", i.e. "do not run before date", i.e. > "run > > > after date" or "run-at date". So, for a daily, job the 2019-01-02 > > > "run_date" corresponds to a 2019-01-01 execution_date. This makes > sense > > > right? > > > > > > Perhaps in the future, the relationship between "run_date" and > > > "execution_date" can be more dynamic. Perhaps in the future we rename > > > "execution_date" for clarity, or to be more generic. But it makes > sense > > > that a dag run will always have a run date, so it doesn't seem like a > > > terrible idea to add a property representing this. > > > > > > Would this meet the goals of the PR? > > > > > > > > > > > > > > > On Wed, Aug 28, 2019 at 11:50 AM James Meickle > > > <jmeic...@quantopian.com.invalid> wrote: > > > > > >> Totally agree with Daniel here. I think that if we implement this > > feature > > >> as proposed, it will actively discourage us from implementing a better > > >> data-aware feature that would remain invisible to most users while > > neatly > > >> addressing a lot of edge cases that currently require really ugly > > hacks. I > > >> believe that having more data awareness features in Airflow (like the > > data > > >> lineage work, or other metadata integrations) is worth investing in if > > we > > >> can do it without too much required user-facing complexity. The > Airflow > > >> project isn't a full data warehouse suite but it's also not just "cron > > with > > >> a UI", so we should try to be pragmatic and fit in power-user features > > >> where we can do so without compromising the project's overall goals. > > >> > > >> On Wed, Aug 28, 2019 at 2:24 PM Daniel Standish <dpstand...@gmail.com > > > > >> wrote: > > >> > > >>> I am just thinking there is the potential for a more comprehensive > > >>> enhancement here, and I worry that this is a band-aid that, like all > > new > > >>> features has the potential to constrain future options. It does not > > help > > >>> us to do anything we cannot already do. > > >>> > > >>> The source of this problem is that scheduling and > interval-of-interest > > >> are > > >>> mixed together. > > >>> > > >>> My thought is there may be a way to separate scheduling and > > >>> interval-of-interest to uniformly resolve "execution_date" vs > > "run_date" > > >>> confusion. We could make *explicit* instead of *implicit* the > > >> relationship > > >>> between run_date *(not currently a concept in airflow)* and > > >>> "interval-of-interest" *(currently represented by execution_date)*. > > >>> > > >>> I also see in this the potential to unlock some other improvements: > > >>> * support a greater diversity of incremental processes > > >>> * allow more flexible backfilling > > >>> * provide better views of data you have vs data you don't. > > >>> > > >>> The canonical airflow job is date-partitioned idempotent data pull. > > Your > > >>> interval of interest is from execution_date to execution_date + 1 > > >>> interval. Schedule_interval is not just the scheduling cadence but > it > > is > > >>> also your interval-of-interest partition function. If that doesn't > > work > > >>> for your job, you set catchup=False and roll your own. > > >>> > > >>> What if there was a way to generalize? E.g. could we allow for more > > >>> flexible partition function that deviated from scheduler cadence? > E.g. > > >>> what if your interval-of-interest partitions could be governed by > "min > > 1 > > >>> day, max 30 days". Then on on-going basis, your daily loads would > be a > > >>> range of 1 day but then if server down for couple days, this could be > > >>> caught up in one task and if you backfill it could be up to 30-day > > >> batches. > > >>> > > >>> Perhaps there is an abstraction that could be used by a greater > > diversity > > >>> of incremental processes. Such a thing could support a nice "data > > >>> contiguity view". I imagine a horizontal bar that is solid where we > > have > > >>> the data and empty where we don't. Then you click on a "missing" > > section > > >>> and you can trigger a backfill task with that date interval > according > > to > > >>> your partitioning rules. > > >>> > > >>> I can imagine using this for an incremental job where each time we > pull > > >> the > > >>> new data since last time; in the `execute` method the operator could > > set > > >>> `self.high_watermark` with the max datetime processed. Or maybe a > > >> callback > > >>> function could be used to gather this value. This value could be > used > > in > > >>> next run, and cold be depicted in a view. > > >>> > > >>> Default intervals of interest could be status quo -- i.e. partitions > > >> equal > > >>> to schedule interval -- but could be overwritten using templating or > > >>> callbacks or setting it during `execute`. > > >>> > > >>> So anyway, I don't have a master plan all figured out. But I think > > there > > >>> is opportunity in this area for more comprehensive enhancement that > > goes > > >>> more directly at the root of the problem. > > >>> > > >>> > > >>> > > >>> > > >>> On Tue, Aug 27, 2019 at 10:00 AM Maxime Beauchemin < > > >>> maximebeauche...@gmail.com> wrote: > > >>> > > >>>> How about an alternative approach that would introduce 2 new keyword > > >>>> arguments that are clear (something like, but maybe better than > > >>>> `period_start_dttm`, `period_end_dttm`) and leave `execution_date` > > >>>> unchanged, but plan it's deprecation. As a first step > `execution_date` > > >>>> would be inferred from the new args, and warn about deprecation when > > >>> used. > > >>>> > > >>>> Max > > >>>> > > >>>> On Tue, Aug 27, 2019 at 9:26 AM Bolke de Bruin <bdbr...@gmail.com> > > >>> wrote: > > >>>> > > >>>>> Execution date is execution date for a dag run no matter what. > There > > >> is > > >>>> no > > >>>>> end interval or start interval for a dag run. The only time this is > > >>>>> relevant is when we calculate the next or previous dagrun. > > >>>>> > > >>>>> So I don't Daniels rationale makes sense (?) > > >>>>> > > >>>>> Sent from my iPhone > > >>>>> > > >>>>>> On 27 Aug 2019, at 17:40, Philippe Gagnon <philgagn...@gmail.com> > > >>>> wrote: > > >>>>>> > > >>>>>> I agree with Daniel's rationale but I am also worried about > > >> backwards > > >>>>>> compatibility as this would perhaps be the most disruptive > breaking > > >>>>> change > > >>>>>> possible. I think maybe we should write down the different options > > >>>>>> available to us (AIP?) and call for a vote. What does everyone > > >> think? > > >>>>>> > > >>>>>>> On Tue, Aug 27, 2019 at 9:25 AM James Coder <jcode...@gmail.com> > > >>>> wrote: > > >>>>>>> > > >>>>>>> Can't execution date can already mean different things depending > > >> on > > >>> if > > >>>>> the > > >>>>>>> dag run was initiated via the scheduler or manually via command > > >>>>> line/API? > > >>>>>>> I agree that making it consistent might make it easier to explain > > >> to > > >>>> new > > >>>>>>> users, but should we exchange that for breaking pretty much every > > >>>>> existing > > >>>>>>> dag by re-defining what execution date is? > > >>>>>>> -James > > >>>>>>> > > >>>>>>> On Mon, Aug 26, 2019 at 11:12 PM Daniel Standish < > > >>>> dpstand...@gmail.com> > > >>>>>>> wrote: > > >>>>>>> > > >>>>>>>>> > > >>>>>>>>> To Daniel’s concerns, I would argue this is not a change to > > >> what a > > >>>> dag > > >>>>>>>> run > > >>>>>>>>> is, it is rather a change to WHEN that dag run will be > > >> scheduled. > > >>>>>>>> > > >>>>>>>> > > >>>>>>>> Execution date is part of the definition of a dag_run; it is > > >>> uniquely > > >>>>>>>> identified by an execution_date and dag_id. > > >>>>>>>> > > >>>>>>>> When someone asks what is a dag_run, we should be able to > provide > > >>> an > > >>>>>>>> answer. > > >>>>>>>> > > >>>>>>>> Imagine trying to explain what a dag run is, when execution_date > > >>> can > > >>>>> mean > > >>>>>>>> different things. > > >>>>>>>> Admin: "A dag run is an execution_date and a dag_id". > > >>>>>>>> New user: "Ok. Clear as a bell. What's an execution_date?" > > >>>>>>>> Admin: "Well, it can be one of two things. It *could* be when > > >>> the > > >>>>>>> dag > > >>>>>>>> will be run... but it could *also* be 'the time when dag should > > >> be > > >>>> run > > >>>>>>>> minus one schedule interval". It depends on whether you choose > > >>> 'end' > > >>>>> or > > >>>>>>>> 'start' for 'schedule_interval_edge.' If you choose 'start' > then > > >>>>>>>> execution_date means 'when dag will be run'. If you choose > 'end' > > >>>> then > > >>>>>>>> execution_date means 'when dag will be run minus one interval.' > > >> If > > >>>> you > > >>>>>>>> change the parameter after some time, then we don't necessarily > > >>> know > > >>>>> what > > >>>>>>>> it means at all times". > > >>>>>>>> > > >>>>>>>> Why would we do this to ourselves? > > >>>>>>>> > > >>>>>>>> Alternatively, we can give dag_run a clear, unambiguous meaning: > > >>>>>>>> * dag_run is dag_id + execution_date > > >>>>>>>> * execution_date is when dag will be run (notwithstanding > > >> scheduler > > >>>>>>> delay, > > >>>>>>>> queuing) > > >>>>>>>> > > >>>>>>>> > > >>>>>>>> > > >>>>>>>> > > >>>>>>>> > > >>>>>>>> > > >>>>>>>> > > >>>>>>>> > > >>>>>>>> > > >>>>>>>> > > >>>>>>>> Execution_date is defined as "run-at date minus 1 interval". > The > > >>>>>>>> assumption in this is that you tasks care about this particular > > >>> date. > > >>>>>>>> Obviously this makes sense for some tasks but not for others. > > >>>>>>>> > > >>>>>>>> I would prop > > >>>>>>>> > > >>>>>>>> > > >>>>>>>> > > >>>>>>>> > > >>>>>>>>> On Sat, Aug 24, 2019 at 5:08 AM James Coder < > jcode...@gmail.com > > >>> > > >>>>> wrote: > > >>>>>>>>> > > >>>>>>>>> I think this is a great improvement and should be merged. To > > >>>> Daniel’s > > >>>>>>>>> concerns, I would argue this is not a change to what a dag run > > >> is, > > >>>> it > > >>>>>>> is > > >>>>>>>>> rather a change to WHEN that dag run will be scheduled. > > >>>>>>>>> I had implemented a similar change in my own version but > > >>> ultimately > > >>>>>>>> backed > > >>>>>>>>> so I didn’t have to patch after each new release. In my opinion > > >>> the > > >>>>>>> main > > >>>>>>>>> flaw in the current scheduler, and I have brought this up > > >> before, > > >>> is > > >>>>>>> when > > >>>>>>>>> you don’t have a consistent schedule interval (e.g. only run > > >> M-F). > > >>>>>>> After > > >>>>>>>>> backing out the “schedule at interval start” I had to switch to > > >> a > > >>>>> daily > > >>>>>>>>> schedule and go through and put a short circuit operator in > each > > >>> of > > >>>> my > > >>>>>>>> M-F > > >>>>>>>>> dags to get the behavior that I wanted. This results in putting > > >>>>>>>> scheduling > > >>>>>>>>> logic inside the dag, when scheduling logic should be in the > > >>>>> scheduler. > > >>>>>>>>> > > >>>>>>>>> -James > > >>>>>>>>> > > >>>>>>>>> > > >>>>>>>>>> On Aug 23, 2019, at 3:14 PM, Daniel Standish < > > >>> dpstand...@gmail.com > > >>>>> > > >>>>>>>>> wrote: > > >>>>>>>>>> > > >>>>>>>>>> Re > > >>>>>>>>>> > > >>>>>>>>>>> What are people's feelings on changing the default execution > > >> to > > >>>>>>>> schedule > > >>>>>>>>>>> interval start > > >>>>>>>>>> > > >>>>>>>>>> and > > >>>>>>>>>> > > >>>>>>>>>>> I'm in favor of doing that, but then exposing new variables > of > > >>>>>>>>>>> "interval_start" and "interval_end", etc. so that people > write > > >>>>>>>>>>> clearer-looking at-a-glance DAGs > > >>>>>>>>>> > > >>>>>>>>>> > > >>>>>>>>>> While I am def on board with the spirit of this PR, I would > > >> vote > > >>> we > > >>>>>>> do > > >>>>>>>>> not > > >>>>>>>>>> accept this PR as is, because it cements a confusing option. > > >>>>>>>>>> > > >>>>>>>>>> *What is the right representation of a dag run?* > > >>>>>>>>>> > > >>>>>>>>>> Right now the representation is "dag run-at date minus 1 > > >>> interval". > > >>>>>>> It > > >>>>>>>>>> should just be "dag run-at date". > > >>>>>>>>>> > > >>>>>>>>>> We don't need to address the question of whether execution > date > > >>> is > > >>>>>>> the > > >>>>>>>>>> start or the end of an interval; it doesn't matter. > > >>>>>>>>>> > > >>>>>>>>>> In all cases, a given dag run will be targeted for *some* > > >> initial > > >>>>>>>> "run-at > > >>>>>>>>>> time"; so *that* should be the time that is part of the PK of > a > > >>> dag > > >>>>>>>> run, > > >>>>>>>>>> and *that *is the time that should be exposed as the dag run > > >>>>>>> "execution > > >>>>>>>>>> date" > > >>>>>>>>>> > > >>>>>>>>>> *Interval of interest is not a dag_run attribute* > > >>>>>>>>>> > > >>>>>>>>>> We also mix in this question of the date interval that the > > >>> *tasks* > > >>>>>>> are > > >>>>>>>>>> interested in. But the *dag run* need not concern itself with > > >>> this > > >>>>>>> in > > >>>>>>>>> any > > >>>>>>>>>> way. That is for the tasks to figure out: if they happen to > > >> need > > >>>>>>> "dag > > >>>>>>>>>> run-at date," then they can reference that; if they want the > > >>> prior > > >>>>>>> one, > > >>>>>>>>> ask > > >>>>>>>>>> for the prior one. > > >>>>>>>>>> > > >>>>>>>>>> Previously, I was in the camp that thought it was a great idea > > >> to > > >>>>>>>> rename > > >>>>>>>>>> "execution_date" to "period_start" or "interval_start". But I > > >>> now > > >>>>>>>> think > > >>>>>>>>>> this is folly. It invokes this question of the "interval of > > >>>>>>> interest" > > >>>>>>>> or > > >>>>>>>>>> "period of interest". But the dag doesn't need to know > > >> anything > > >>>>>>> about > > >>>>>>>>>> that. > > >>>>>>>>>> > > >>>>>>>>>> Within the same dag you may have tasks with different > intervals > > >>> of > > >>>>>>>>>> interest. So why make assumptions in the dag; just give the > > >>> facts: > > >>>>>>>> this > > >>>>>>>>> is > > >>>>>>>>>> my run date; this is the prior run date, etc. It would be a > > >>>>>>> regression > > >>>>>>>>>> from the perspective of providing accurate names. > > >>>>>>>>>> > > >>>>>>>>>> *Proposal* > > >>>>>>>>>> > > >>>>>>>>>> So, I would propose we change "execution_date" to mean "dag > > >>> run-at > > >>>>>>>> date" > > >>>>>>>>> as > > >>>>>>>>>> opposed to "dag run-at date minus 1". But we should do so > > >>> without > > >>>>>>>>>> reference to interval end or interval start. > > >>>>>>>>>> > > >>>>>>>>>> *Configurability* > > >>>>>>>>>> > > >>>>>>>>>> The more configuration options we have, the more noise there > is > > >>> as > > >>>> a > > >>>>>>>> user > > >>>>>>>>>> trying to understand how to use airflow, so I'd rather us not > > >>> make > > >>>>>>> this > > >>>>>>>>>> configurable at all. > > >>>>>>>>>> > > >>>>>>>>>> That said, perhaps a more clear and more explicit means making > > >>> this > > >>>>>>>>>> configurable would be to define an integer param > > >>>>>>>>>> "dag_run_execution_date_interval_offset", which would control > > >> how > > >>>>>>> many > > >>>>>>>>>> intervals back from actual "dag run-at date" the "execution > > >> date" > > >>>>>>>> should > > >>>>>>>>>> be. (current behavior = 1, new behavior = 0). > > >>>>>>>>>> > > >>>>>>>>>> *Side note* > > >>>>>>>>>> > > >>>>>>>>>> Hopefully not to derail discussion: I think there are > > >> additional, > > >>>>>>>> related > > >>>>>>>>>> task attributes that may want to come into being: namely, > > >>>>>>> low_watermark > > >>>>>>>>> and > > >>>>>>>>>> high_watermark. There is the potential, with attributes like > > >>> this, > > >>>>>>> for > > >>>>>>>>>> adding better out-of-the-box support for common data workflows > > >>> that > > >>>>>>> we > > >>>>>>>>> now > > >>>>>>>>>> need to use xcom for, namely incremental loads. But I want to > > >>> give > > >>>>>>> it > > >>>>>>>>> more > > >>>>>>>>>> thought before proposing anything specific. > > >>>>>>>>>> > > >>>>>>>>>> > > >>>>>>>>>> > > >>>>>>>>>> > > >>>>>>>>>> > > >>>>>>>>>> > > >>>>>>>>>> On Fri, Aug 23, 2019 at 9:42 AM Jarek Potiuk < > > >>>>>>> jarek.pot...@polidea.com > > >>>>>>>>> > > >>>>>>>>>> wrote: > > >>>>>>>>>> > > >>>>>>>>>>> Good one Damian. I will have a list of issues that can be > > >>> possible > > >>>>>>> to > > >>>>>>>>>>> handle at the workshop, so that one goes there. > > >>>>>>>>>>> > > >>>>>>>>>>> J. > > >>>>>>>>>>> > > >>>>>>>>>>> Principal Software Engineer > > >>>>>>>>>>> Phone: +48660796129 > > >>>>>>>>>>> > > >>>>>>>>>>> pt., 23 sie 2019, 11:09 użytkownik Shaw, Damian P. < > > >>>>>>>>>>> damian.sha...@credit-suisse.com> napisał: > > >>>>>>>>>>> > > >>>>>>>>>>>> I can't understate what a conceptual improvement this would > > >> be > > >>>> for > > >>>>>>>> the > > >>>>>>>>>>> end > > >>>>>>>>>>>> users of Airflow in our environment. I've written a lot of > > >> code > > >>>> so > > >>>>>>>> all > > >>>>>>>>>>> our > > >>>>>>>>>>>> configuration works like this anyway. But the UI still shows > > >>> the > > >>>>>>>>> Airflow > > >>>>>>>>>>>> dates which still to this day sometimes confuse me. > > >>>>>>>>>>>> > > >>>>>>>>>>>> I'll be at the NY meet ups on Monday and Tuesday, maybe some > > >> of > > >>>> my > > >>>>>>>>> first > > >>>>>>>>>>>> PRs could be additional test cases around edge cases to do > > >> with > > >>>> DST > > >>>>>>>> and > > >>>>>>>>>>>> cron scheduling that I have concerns about :) > > >>>>>>>>>>>> > > >>>>>>>>>>>> Damian > > >>>>>>>>>>>> > > >>>>>>>>>>>> -----Original Message----- > > >>>>>>>>>>>> From: Ash Berlin-Taylor [mailto:a...@apache.org] > > >>>>>>>>>>>> Sent: Friday, August 23, 2019 6:50 AM > > >>>>>>>>>>>> To: dev@airflow.apache.org > > >>>>>>>>>>>> Subject: Setting to add choice of schedule at end or > schedule > > >>> at > > >>>>>>>> start > > >>>>>>>>> of > > >>>>>>>>>>>> interval > > >>>>>>>>>>>> > > >>>>>>>>>>>> This has come up a few times before, someone has now opened > a > > >>> PR > > >>>>>>> that > > >>>>>>>>>>>> makes this a global+per-dag setting: > > >>>>>>>>>>>> https://github.com/apache/airflow/pull/5787 and it also > > >>> includes > > >>>>>>>> docs > > >>>>>>>>>>>> that I think does a good job of illustrating the two modes. > > >>>>>>>>>>>> > > >>>>>>>>>>>> Does anyone object to this being merged? If no one says > > >>> anything > > >>>> by > > >>>>>>>>>>> midday > > >>>>>>>>>>>> on Tuesday I will take that as assent and will merge it. > > >>>>>>>>>>>> > > >>>>>>>>>>>> The docs from the PR included below. > > >>>>>>>>>>>> > > >>>>>>>>>>>> Thanks, > > >>>>>>>>>>>> Ash > > >>>>>>>>>>>> > > >>>>>>>>>>>> Scheduled Time vs Execution Time > > >>>>>>>>>>>> '''''''''''''''''''''''''''''''' > > >>>>>>>>>>>> > > >>>>>>>>>>>> A DAG with a ``schedule_interval`` will execute once per > > >>>> interval. > > >>>>>>> By > > >>>>>>>>>>>> default, the execution of a DAG will occur at the **end** of > > >>> the > > >>>>>>>>>>>> schedule interval. > > >>>>>>>>>>>> > > >>>>>>>>>>>> A few examples: > > >>>>>>>>>>>> > > >>>>>>>>>>>> - A DAG with ``schedule_interval='@hourly'``: The DAG run > > >> that > > >>>>>>>>> processes > > >>>>>>>>>>>> 2019-08-16 17:00 will start running just after 2019-08-16 > > >>>> 17:59:59, > > >>>>>>>>>>>> i.e. once that hour is over. > > >>>>>>>>>>>> - A DAG with ``schedule_interval='@daily'``: The DAG run > that > > >>>>>>>> processes > > >>>>>>>>>>>> 2019-08-16 will start running shortly after 2019-08-17 > 00:00. > > >>>>>>>>>>>> > > >>>>>>>>>>>> The reasoning behind this execution vs scheduling behaviour > > >> is > > >>>> that > > >>>>>>>>>>>> data for the interval to be processed won't be fully > > >> available > > >>>>>>> until > > >>>>>>>>>>>> the interval has elapsed. > > >>>>>>>>>>>> > > >>>>>>>>>>>> In cases where you wish the DAG to be executed at the > > >> **start** > > >>>> of > > >>>>>>>> the > > >>>>>>>>>>>> interval, specify ``schedule_at_interval_end=False``, either > > >> in > > >>>>>>>>>>>> ``airflow.cfg``, or on a per-DAG basis. > > >>>>>>>>>>>> > > >>>>>>>>>>>> > > >>>>>>>>>>>> > > >>>>>>>>>>>> > > >>>>>>>>>>> > > >>>>>>>>> > > >>>>>>>> > > >>>>>>> > > >>>>> > > >>>> > > >>> > > >> > > > =============================================================================== > > >>>>>>>>>>>> > > >>>>>>>>>>>> Please access the attached hyperlink for an important > > >>> electronic > > >>>>>>>>>>>> communications disclaimer: > > >>>>>>>>>>>> > > >> http://www.credit-suisse.com/legal/en/disclaimer_email_ib.html > > >>>>>>>>>>>> > > >>>>>>>>>>> > > >>>>>>>>> > > >>>>>>>> > > >>>>>>> > > >>>>> > > >>>> > > >>> > > >> > > > =============================================================================== > > >>>>>>>>>>>> > > >>>>>>>>>>>> > > >>>>>>>>>>> > > >>>>>>>>> > > >>>>>>>> > > >>>>>>> > > >>>>> > > >>>> > > >>> > > >> > > >