Airflow 用真实脚本实现气流

Airflow 用真实脚本实现气流,airflow,Airflow,我成功地设置了一个Airflow服务器。我想做一些测试工作,但我很难找到适合我尝试做的初学者指南 当前状态: Python脚本从SFTP(本地计算机上不存在的任何文件)下载文件或从查询创建文件 要将数据读入内存,请以某种方式对其进行修改,以便为数据库做好准备(查找新维度、重新映射、添加计算)。将数据加载到数据库中的相应表中。发送电子邮件摘要(熊猫到_html) 我大多数脚本的逻辑都是基于如果文件没有被处理,那么就处理它。”“已处理”文件在db表中按文件名组织,或者我将文件移动到特殊的已处理文

我成功地设置了一个Airflow服务器。我想做一些测试工作,但我很难找到适合我尝试做的初学者指南

当前状态:

  • Python脚本从SFTP(本地计算机上不存在的任何文件)下载文件或从查询创建文件
  • 要将数据读入内存,请以某种方式对其进行修改,以便为数据库做好准备(查找新维度、重新映射、添加计算)。将数据加载到数据库中的相应表中。发送电子邮件摘要(熊猫到_html)
我大多数脚本的逻辑都是基于如果文件没有被处理,那么就处理它。”“已处理”文件在db表中按文件名组织,或者我将文件移动到特殊的已处理文件夹中

我的另一个逻辑是基于文件名中的日期。我比较了文件存在的日期和应该存在的日期(一系列日期)。如果文件不存在,则创建它(通常是BCP或PSQL查询)

我要运行这些.py文件吗?或者我应该修改脚本以使用一些气流参数/jinja模板

我几乎觉得我几乎可以用Bash操作符处理所有事情。这样行吗

dag_input = sys.argv[1]

def alter_table(query, engine=pg_engine):
    fake_conn = engine.raw_connection()
    fake_cur = fake_conn.cursor()
    fake_cur.execute(query)
    fake_conn.commit()
    fake_cur.close()

query_list = [
              f'SELECT * from table_1 where report_date = \'{dag_input}\'',
              f'SELECT * from table_2 where report_date = \'{dag_input}\'',
]

for value in query_list:
    alter_table(value)
那么dag应该是这样的,有一个气流参数用于sys.argv

templated_command = """
        python download_raw.py "{{ ds }}"
"""

t3 = BashOperator(
    task_id='download_raw',
    bash_command=templated_command,
    dag=dag)

由于此任务的代码是python,因此我将使用python运算符

在download_raw.py中放置一个以**kwargs为参数的方法,您可以访问上下文中的所有内容

从下载\u原始导入我的功能
t3=蟒蛇算子(
任务\u id='download\u raw',
python\u callable=my\u func,
dag=dag)
#内部下载_raw.py
定义我的职能(**kwargs):
上下文=kwargs
ds=上下文['ds']
... (请按这里的逻辑)

我会这样做,否则当出现多个上下文时,您的bash命令可能会变得可怕。

您能提供一个具体的示例吗?ds指的是执行日期吗?我想我现在的问题是,我有太多的代码,其中一些已经有好几年了,每天都在运行。我不太愿意做很多改变,除非这样做真的有意义。这是一个非常具体的例子。在您的帖子中,您使用{{ds}}指定了执行日期,以及我在示例中使用它的原因。有关您可以使用上下文对象访问的内容的更全面列表,请参见此处:您可能不需要对代码进行太多更改,但需要添加一个入口点,在我的示例中,它是my_func。在这个函数中,您可以使用ds(或上下文中的任何其他内容),重新格式化您喜欢的格式,并将其传递给您现有的程序逻辑。仅供参考,大约一年后,但我使用的是您在此概述的方法。