Использование ds_add и макросов с Airflow - PullRequest
0 голосов
/ 09 октября 2018

Я хочу получить execution date - 2 months в формате YYYY-MM-DD HH:MM

Это то, что я написал:

EXEC_TIMESTAMP_2_MONTHS_AGO = "{{ macros.ds_add(execution_date.strftime('%Y-%m-%d/%H:%M'), -60) }}"

Однако это не работает.Это не делает.

В чем проблема?

Редактировать: Это оператор:

import_orders_op = MySqlToGoogleCloudStorageOperator(
    task_id='import_orders_and_upload_to_storage',
    mysql_conn_id='mysqlcon',
    google_cloud_storage_conn_id='gcpcon',
    provide_context=True,
    sql = 'import_orders.sql',
    params={'max_Orders_ID_2_months_ago': EXEC_TIMESTAMP_2_MONTHS_AGO, 'table_name' :  TABLE_NAME},
    bucket=GCS_BUCKET_ID,
    filename=file_name,
    dag=dag) 

Ошибка:

mysql_exceptions.ProgrammingError: (1064, "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '{ (execution_date - macros.timedelta(days=60)).strftime('%Y-%m-%d %H:%M') }}\n   ' at line 51")

Ответы [ 2 ]

0 голосов
/ 09 октября 2018

IIRC значения параметров не задаются.Таким образом, строковое значение передается явно.

Ваш пример оператора загружает import_orders.sql.Предположительно, вы используете какой-то шаблонный макрос для загрузки значений в параметре dict.Макросы никогда не расширяются рекурсивно.Поэтому вместо этого просто поместите шаблон, как предложено, с датой выполнения минус 60-дневный интервал и с форматированием строки, которое вы хотите, прямо в файл sql, где у вас был макрос params.

Например, если ваш файл SQL выглядел следующим образом:

SELECT * FROM {{ params.table_name }}
WHERE ID > {{ params.max_Orders_ID_2_months_ago }};

Я предлагаю вам вставить в (исправленный) макрос:

SELECT * FROM {{ params.table_name }}
WHERE ID > {{ (execution_date - macros.timedelta(days=60)).strftime('%Y-%m-%d/%H:%M') }};

Поскольку macros.ds_add(ds, -60) прежде всего работает только с %Y-%m-%d строками, такими как {{ ds }} ивыводит только строки в %Y-%m-%d.

0 голосов
/ 09 октября 2018

В идеале вы должны включать в свой пост любые сообщения об ошибках из журнала, это поможет будущим поисковикам, а также поможет сузить проблему.

Я думаю, что сейчас происходит то, что вы используете ds_add, но на execute_date, который является подходящей датой-временем.Обычно это делается на ds, который является строковым представлением.

Вместо этого вам нужно будет непосредственно вычесть дату выполнения и , а затем отформатировать ее так, как вы хотите.

{{ (execution_date - macros.timedelta(days=60)).strftime('%Y-%m-%d/%H:%M') }}

Для полноты - этот расчет может происходить только в вашем шаблонном sql или шаблонном файле sql.

...