2017-07-12 8 views
1

オペレータの外でエアフローマクロを使用する方法はありますか?スキャナを呼び出すときに、「DS」の値が予想される実行日に置き換えられますのでエアフロー:オペレータ以外のマクロの使用

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」の値を使用したい:例えば

、DAGに私がアクションを持っていますいくつかの他の場所。しかし、その場合、値を置き換えるのではなく、文字列全体を「{{ds}}」として取得します。上記の例では、 printステートメントは "{{ds}}"の実行日ではありません。

答えて

-2

二重引用符を使用してください。あなたbucket_keyため

datestamp = "{{ ds }}" 
print datestamp 
1

ラッキーすぐ内側神社テンプレートを入れ、テンプレートです。

… 
bucket_key=getPath() + '{{ ds }}', 
… 

これらのマクロは完全には使用できません。このファイルは、ダグ実行中だけでなく、スケジューラによって定期的に解釈されるためです。したがって、ダグが実行されていない場合、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) 
関連する問題