有没有办法在任何运营商之外使用Airflow宏?
例如,在DAG中我有一个动作:
datestamp = '{{ ds }}'
print(datestamp) # prints string not the date when I run it for any date
scanner = S3KeySensor(
task_id='scanner',
poke_interval=60,
timeout=24 * 60 * 60,
soft_fail=False,
wildcard_match=True,
bucket_key=getPath() + datestamp, #datestamp correctly replaced with execution date
bucket_name=bucketName,
dag=dag)
因此,当调用扫描程序时,“ds”值将被替换为预期的执行日期,但我想在其他一些地方使用“ds”值。但在这种情况下,它不会替换值,而是将整个字符串作为“{{ds}}”。在上面的例子中。 print语句打印“{{ds}}”而不是执行日期。
答案 0 :(得分:1)
幸运的是你bucket_key
是模板化的,只需将jinja模板放入其中。
…
bucket_key=getPath() + '{{ ds }}',
…
完全在操作员外部,您无法使用这些宏。因为调度程序会定期解释文件,而不仅仅是在dag运行期间。那么当dag没有运行时ds
的值是多少呢?
然而,由于你不太可能想要在任务之外对它做任何事情,你可以把它放到模板化的领域。您还可以扩展另一个要模板化的字段。
class MySensor(S3KeySensor):
template_fields = ('bucket_key', 'bucket_name', 'my_thing')
def __init__(self, my_thing=None, *args, **kwargs):
super(MySensor, self).__init__(*args, **kwargs)
self.my_tyhing = my_thing
def post_execute(self, context):
logging.info(
"I probably wanted to over-ride poke to use {}".format(my_thing)
scanner = MySensor(
my_thing='{{ ds }}',
task_id='scanner',
poke_interval=60,
timeout=24 * 60 * 60,
soft_fail=False,
wildcard_match=True,
bucket_key=getPath() + '{{ ds }}',
bucket_name=bucketName,
dag=dag)
答案 1 :(得分:-3)
使用双引号。
datestamp = "{{ ds }}"
print datestamp