【发布时间】:2020-12-29 17:00:50
【问题描述】:
我是 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',
)
我没有收到任何警告或错误,代码正在运行并且任务被标记为成功。它确实创建了我想要的表,其中包含我指定的列,但完全是空的。
知道我做错了什么吗?
编辑:我在一个小得多的表(从 10Gb 到几 Kb)上尝试了相同的代码,执行结果更小的查询(从 500Mb 到几 Kb),这次它确实有效。您认为表的大小/查询结果重要吗?有限制吗?还是执行过大的查询会导致某种滞后?
EDIT2:经过几次测试后,我可以确认此问题与查询或表的大小无关。它似乎与日期格式有关。在我的代码中,WHERE 条件实际上是检查 date_column = 'YYYY-MM-DD'。当我用 int 或 string 比较替换这个条件时,它工作得很好。你们知道 Bigquery 是使用特定的日期格式还是需要特定的语法?
EDIT3:终于到了某个地方:当我将 date_column 转换为日期 (CAST(date_column AS DATE)) 以强制其类型为 DATE 时,我收到一条错误消息,指出我的字段实际上是 int-32(参数类型不匹配)。但我确信该字段是一个日期,因此这意味着 Bigquery 将其存储为 int 而将其显示为日期,或者 Bigquery 运算符在加载表时进行某种隐藏的类型转换。关于如何解决这个问题的任何想法?
【问题讨论】:
-
您给出的示例似乎是正确的,我怀疑该查询没有给出任何结果。您是否尝试过复制呈现的 sql(在 ui 中)并在 BigQuery 中运行?
-
是的,我做到了,但别担心我找到了答案,它是 legacy_sql 参数,似乎默认设置为 True,我只是将其关闭,一切正常 :)这么多时间在这么愚蠢的事情上x)
-
你不是第一个@armaaj ;)
标签: sql google-bigquery airflow