шаблон потока воздуха становится строкой

1

Я пытаюсь использовать шаблон jinja для анализа некоторого json, найденного в xcom, в словаре. Примечание ниже, что Operator и templated_field - это psuedo-code.

def xcom_from_json(xcom):
    xcom_loaded = json.loads(xcom)
    logging.info(pformat(f'xcom loaded: {xcom_loaded}', indent=3))
    return xcom_loaded

PythonOperator(python_callable=some_callable,
           op_args=[f'{{{{ (ti.xcom_pull("{task_id}") | xcom_from_json)["data"]["stats"] }}}}'])

Вышеуказанные работы, почти. В some_callable методе я получаю разобранный jinja, но он выступает как строгий dict вместо необработанного dict. Это не имеет смысла, потому что вы можете видеть, что структура перемещается как dict в шаблоне jinja. Содержит ли jinja все, что выходит из шаблона? Если да, есть ли способ не делать этого?

Теги:
airflow
jinja2

1 ответ

2
Лучший ответ

Обрабатываемый шаблон jinja всегда будет возвращать строку. Вместо этого вы можете выбрать значение XCom из метода python.

def some_callable(task_id, **context):
    stats = json.loads(context['ti'].xcom_pull(task_id)['data']['stats'])

PythonOperator(
    ...
    python_callable=some_callable,  
    op_args=[f'{task_id}'],
    provide_context=True)

Обратите внимание, что вы должны предоставить контекст, который дает методу python тот же доступ к значениям, которые имеет шаблон jinja.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню