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:某些行属于不同的分区而不是目标分区的主要内容,如果未能解决你的问题,请参考以下文章

BigQuery 插入作业而不是流式传输

BigQuery 加载 - NULL 被视为字符串而不是空

具有集群和分区的表上的 Bigquery SQL 性能问题

Bigquery 分区表中的重复项

BigQuery 完全外连接产生“左连接”结果

为啥 bigquery 在某些表后面显示数字 (1)