Bigquery:某些行属于不同的分区而不是目标分区
Posted
技术标签:
【中文标题】Bigquery:某些行属于不同的分区而不是目标分区【英文标题】:Biqquery: Some rows belong to different partitions rather than destination partition 【发布时间】:2019-12-04 18:52:37 【问题描述】:我正在运行一个 Airflow DAG,它使用运算符 GoogleCloudStorageToBigQueryOperator 将数据从 GCS 移动到 BQ,我使用的是 Airflow 版本 1.10.2。
此任务将数据从 mysql 移动到 BQ(表分区),这段时间我们被 Ingestion-time
分区,过去三天的增量负载在使用 Airflow DAG 加载数据时工作正常。
现在我们将表中 DATE 列上的分区类型更改为 Date or timestamp
,之后我们开始收到此错误,因为我们正在获取增量负载以从 MySql 表中获取最近三天的数据,我期待 BQ 作业附加新记录或使用我之前测试过的“WRITE_TRUNCATE”重新创建分区,但它们都失败并显示以下错误消息。
Exception: BigQuery job failed. Final error was: 'reason': 'invalid', 'message': 'Some rows belong to different partitions rather than destination partition 20191202'.
我将无法发布代码,因为所有模块都是基于 JSON 参数调用的,但这是我使用其他常规参数传递给此表的操作员的内容
create_disposition='CREATE_IF_NEEDED',
time_partitioning = 'field': 'entry_time', 'type': 'DAY'
write_disposition = 'WRITE_APPEND' #Tried with 'WRITE_TRUNCATE'
schema_update_options = ('ALLOW_FIELD_ADDITION',
'ALLOW_FIELD_RELAXATION')
我认为这些是可能导致问题的字段,感谢您对此提供任何帮助。
【问题讨论】:
【参考方案1】:当使用 Bigquery 按日期或时间戳划分的表时,您应该指定 partition to load the data。 例如
table_name$20160501
此外,您的列值应与分区匹配,例如,如果您创建此表:
$ bq query --use_legacy_sql=false "CREATE TABLE tmp_elliottb.PartitionedTable (x INT64, y NUMERIC, date DATE) PARTITION BY date"
列 date 是分区的列,如果您尝试加载下一行
$ echo "1,3.14,2018-11-07" > row.csv
$ bq "tmp_elliottb.PartitionedTable\$20181105" ./row.csv
当您使用分区 20181107
时,您将收到此错误,因为您正在从 2018-11-07 加载数据Some rows belong to different partitions rather than destination partition 20181105
我建议使用以下 destination_project_dataset_table 值并验证数据是否与分区日期匹配。
destination_project_dataset_table='dataset.table$YYYYMMDD',
【讨论】:
感谢您的回答,我发现我们的 Airflow 框架确实将带有今天执行日期的 $YYYYMMDD 值传递给了 destination_project_dataset_table 如果表已分区,这就是我收到上述错误的原因,即使我有逻辑只为该特定分区发送数据,框架也会自动将 $YYYYMMDD 添加到目标数据集。所以基本上destination_project_dataset_table 变量是模板化的。以上是关于Bigquery:某些行属于不同的分区而不是目标分区的主要内容,如果未能解决你的问题,请参考以下文章