gpt4 book ai didi

jinja2 - 在 Airflow 的运算符参数中将 jinja 模板格式化为 INT

转载 作者:行者123 更新时间:2023-12-05 08:49:16 26 4
gpt4 key购买 nike

我正在尝试将 jinja 模板参数格式化为整数,以便我可以将其传递给需要 INT(可以是自定义或 PythonOperator)的运算符,但我无法做到。

请参阅下面的示例 DAG。我正在使用内置的 Jinja 过滤器 | int但这不起作用 - 类型仍然是 <class 'str'>

我对 Airflow 还是个新手,但根据我对 Jinja/Airflow 作品的了解,我认为这是不可能的。我看到两个主要的解决方法:

  • 更改运算符参数以期望字符串并处理下面的转换。
  • 单独的 PythonOperator 中处理此转换,它将字符串转换为 int 并使用 xcom/task context 导出它。 (我认为这会起作用但不确定)

请让我知道任何其他解决方法

def greet(mystr):
print (mystr)
print(type(mystr))

default_args = {
'owner': 'airflow',
'start_date': days_ago(2)
}

dag = DAG(
'template_dag',
default_args=default_args,
description='template',
schedule_interval='0 13 * * *'
)


with dag:

# foo = "{{ var.value.my_custom_var | int }}" # from variable
foo = "{{ execution_date.int_timestamp | int }}" # built in macro

# could be MyCustomOperator
opr_greet = PythonOperator(task_id='greet',
python_callable=greet,
op_kwargs={'mystr': foo}
)

opr_greet

Airflow 1.10.11

最佳答案

更新后的答案:

从 Airflow 2.1 开始,您可以将 render_template_as_native_obj=True 传递给 dag,Airflow 将返回 Python 类型(dict、int 等)而不是字符串。看这个pull request

dag = DAG(
dag_id="example_template_as_python_object",
schedule_interval=None,
start_date=days_ago(2),
render_template_as_native_obj=True,
)

以前版本的旧答案:

我发现了一个提供最佳解决方法的相关问题,IMO。

Airflow xcom pull only returns string

诀窍是使用 PythonOperator,在那里进行数据类型转换,然后使用参数调用主运算符。下面是将 json 字符串转换为 dict 对象的示例。同样可以应用于将字符串转换为 int 等。

def my_func(ds, **kwargs):
ti = kwargs['ti']
body = ti.xcom_pull(task_ids='privious_task_id')
import_body= json.loads(body)
op = CloudSqlInstanceImportOperator(
project_id=GCP_PROJECT_ID,
body= import_body,
instance=INSTANCE_NAME,
gcp_conn_id='postgres_default',
task_id='sql_import_task',
validate_body=True,
)
op.execute()


p = PythonOperator(task_id='python_task', python_callable=my_func)

关于jinja2 - 在 Airflow 的运算符参数中将 jinja 模板格式化为 INT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64235496/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com