将气流变量导入PySpark

将气流变量导入PySpark,pyspark,airflow,apache-airflow-xcom,Pyspark,Airflow,Apache Airflow Xcom,最近我一直在玩气流和Pypark。我看到气流有很多变量。我的目标是解析其中一个变量,并将其导入我的pySpark脚本。到目前为止,我试图回显变量的值,但是,我找不到导入到pyspark的方法。我想将该变量的值传递到pyspark脚本中的另一个变量。我还附加了我的代码job\u id,这是我所说的变量 test_bash = """ export un_id={{ti.job_id}} echo $un_id """ bash_task = BashOperator( task_id='

最近我一直在玩气流和Pypark。我看到气流有很多变量。我的目标是解析其中一个变量,并将其导入我的pySpark脚本。到目前为止,我试图回显变量的值,但是,我找不到导入到pyspark的方法。我想将该变量的值传递到pyspark脚本中的另一个变量。我还附加了我的代码job\u id,这是我所说的变量

test_bash = """
export un_id={{ti.job_id}}
echo $un_id
"""

bash_task = BashOperator(
    task_id='test',
    bash_command=test_bash,
    xcom_push=True,
    provide_context=True,
    dag=dag)

def pull_function(**kwargs):
    ti = kwargs['ti']
    rt = ti.xcom_pull(task_ids='test')
    print(rt)

pull_task = PythonOperator(
    task_id='pull_task',
    python_callable=pull_function,
    provide_context=True,
    dag=dag
)

#############
bash_task >> pull_task

你知道我该怎么做,或者我做错了什么吗?

这个值实际上叫做run\u id,可以通过上下文或宏访问

在Pythonoperator中,这是通过上下文访问的,在bash操作符中,这是通过bash_命令字段上的jinja模板访问的

有关宏中可用内容的详细信息:

有关jinja的更多信息:


以这个dag为例,检查每个操作员的日志,您应该会看到日志中打印的run_id。

我没有尝试@kaxil建议的方法,但如果我理解并更正您的问题,您希望从Airflow中检索run_id变量,并在python pySpark脚本中使用它。如果是这样的话,我假设您使用BashOperator来spark提交作业。提交spark作业时,您可以随作业一起提交。这些参数显示为系统参数,如果执行printsys.argv,您可以看到这些参数,这有助于查看变量在哪个位置。 因为您已经用bash_任务推送了变量,所以必须拉取它。因此,当您提交spark作业时,还应添加以下额外参数:

cmd=""spark-submit your-pyspark-file.py {{ ti.xcom_pull("test") }}

retrieval = BashOperator(
    namespace='randomname',
    arguments=[cmd],
    name='example-dag1',
    task_id='name-you-desire',
    provide_context=True,
    get_logs=True, 
    dag=dag)

然后,如果您确实执行了printsys.argv,您将能够看到变量作为参数,并且在脚本中,如果变量位于第二个位置,您可以通过sys.argv[1]引用该变量;如果变量位于第一个位置,则可以通过0引用该变量。

谢谢,它正在工作!还有一件事我想问你,为了在我的pySpark脚本中检索run_id,我是否必须像导入系统变量一样遵循这个过程?或者有没有一种特殊的方法来检索和引用该变量?很高兴它起到了作用,您能否接受这个答案,以便将来遇到这个问题的用户知道:关于在PySpark脚本中导入run_id,取决于您运行的操作符。如果您使用BashOperator,您可以在脚本中使用{{run_id}}以同样的方式使用它。我仍在努力导入。我假设它是一个env变量,但显然不是。我还尝试了在您提供的链接中找到的方法:testing={run\u id}bash\u task=bash operator task\u id='bash\u run\u id',bash\u command='echo{{run\u id}',bash\u command='tmp/myfile.py',provide\u context=True,dag=dag,env={UNIQUE\u id':testing},但它也不起作用。我无法理解我遗漏了什么。嘿,不,你应该使用PythonOperator来运行那个文件,然后它就可以工作了。如果要使用bash操作符,则需要使用bash脚本,例如bash_command=run_pyspark.sh。您的run_pyspark.sh可以将第一行作为export RUNID={{run_id};python tmp/myfile.py,在python文件中,您可以通过os.environ[RUNID]使用它
cmd=""spark-submit your-pyspark-file.py {{ ti.xcom_pull("test") }}

retrieval = BashOperator(
    namespace='randomname',
    arguments=[cmd],
    name='example-dag1',
    task_id='name-you-desire',
    provide_context=True,
    get_logs=True, 
    dag=dag)