#sql #google-bigquery #airflow
#sql #google-bigquery #воздушный поток
Вопрос:
Я новичок в Airflow, и в настоящее время я застрял на проблеме с оператором Bigquery. Я пытаюсь выполнить простой запрос к таблице из заданного набора данных и скопировать результат в новую таблицу в том же наборе данных. Для этого я использую оператор bigquery, поскольку, согласно документу, параметр ‘destination_dataset_table’ должен выполнять именно то, что я ищу (источник: https://airflow.apache.org/docs/stable/_api/airflow/contrib/operators/bigquery_operator/index.html#airflow.contrib.operators.bigquery_operator.BigQueryOperator).
Но вместо копирования данных все, что я получаю, — это новая пустая таблица со схемой той, из которой я запрашиваю.
Вот мой код
default_args = {
'owner':'me',
'depends_on_past':False,
'start_date':datetime(2019,1,1),
'end_date':datetime(2019,1,3),
'retries':10,
'retry_delay':timedelta(minutes=1),
}
dag = DAG(
dag_id='my_dag',
default_args=default_args,
schedule_interval=timedelta(days=1)
)
copyData = BigQueryOperator(
task_id='copyData',
dag=dag,
sql=
"SELECT some_columns,x,y,z FROM dataset_d.table_t WHERE some_columns=some_value",
destination_dataset_table='dataset_d.table_u',
bigquery_conn_id='something',
)
Я не получаю никаких предупреждений или ошибок, код запущен, и задачи отмечены как успешные. Он создает таблицу, которую я хотел, с указанными мной столбцами, но совершенно пустыми.
Есть идеи, что я делаю не так?
РЕДАКТИРОВАТЬ: я попробовал тот же код для таблицы гораздо меньшего размера (от 10 ГБ до нескольких Кб), выполнив запрос с гораздо меньшим результатом (от 500 МБ до нескольких Кб), и на этот раз это сработало. Как вы думаете, размер таблицы / результат запроса имеет значение? Это ограничено? Или выполнение слишком большого запроса вызывает какое-то отставание?
EDIT2: После еще нескольких тестов я могу подтвердить, что эта проблема не связана с размером запроса или таблицы. Похоже, это как-то связано с форматом даты. В моем коде условие WHERE фактически проверяет, является ли date_column = ‘ГГГГ-ММ-ДД’. Когда я заменяю это условие сравнением int или string, оно работает отлично. Ребята, вы знаете, использует ли Bigquery определенный формат даты или требует определенного синтаксиса?
ПРАВКА3: Наконец-то что-то получается: когда я использую свой date_column в качестве даты (ПРИВЕДЕНИЕ (date_column В КАЧЕСТВЕ ДАТЫ)), чтобы принудительно ввести его тип в DATE, я получаю сообщение об ошибке, в котором говорится, что мое поле на самом деле является int-32 (несоответствие типа аргумента). Но я УВЕРЕН, что это поле является датой, так что это означает, что либо Bigquery сохраняет его как int при отображении в качестве даты, либо оператор Bigquery выполняет какое-то скрытое преобразование типов при загрузке таблиц. Есть идеи о том, как это исправить?
Комментарии:
1. Приведенный вами пример кажется правильным, и я подозреваю, что запрос ничего не дает в качестве результата. Вы пробовали копировать отображаемый sql (в пользовательском интерфейсе) и запускать его в BigQuery?
2. Да, я сделал, но не волнуйтесь, я нашел ответ, это был параметр legacy_sql, похоже, что по умолчанию для него установлено значение True, я просто отключил его, и все заработало 🙂 Потерял столько времени на такую глупую вещь x)
3. Ты не первый @armaaj 😉
Ответ №1:
У меня была аналогичная проблема при передаче данных из других источников данных, кроме big-query.
Я предлагаю использовать date_column следующим образом: to_char(date_column, 'YYYY-MM-DD') as date
В общем, я видел, что схема автоматического обнаружения больших запросов часто проблематична. Самый безопасный способ — всегда указывать схему перед выполнением соответствующего запроса или использовать операторы, которые поддерживают определение схемы.