我正在运行一个 Airflow DAG,它使用运算符 GoogleCloudStorageToBigQueryOperator 将数据从 GCS 移动到 BQ,我使用的是 Airflow 版本 1.10.2。
此任务将数据从 MySql 移动到 BQ(表分区),一直以来我们都按摄取时间
进行分区,并且过去三天的增量加载在使用加载数据时工作正常 Airflow DAG。
现在,我们将表中 DATE 列的分区类型更改为“日期或时间戳”,之后我们开始收到此错误,因为我们正在获取增量加载以获取最后的数据从 MySql 表三天后,我期望 BQ 作业追加新记录或使用我之前测试过的“WRITE_TRUNCATE”重新创建分区,但两者都失败并显示以下错误消息。
异常:BigQuery 作业失败。最终错误是:{'reason': 'invalid', 'message': '某些行属于不同分区而不是目标分区 20191202'}。
我无法发布代码,因为所有模块都是基于 JSON 参数调用的,但这是我使用其他常规参数传递给该表的运算符(operator)的内容
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')
我相信这些字段可能会导致问题,我们将不胜感激。
最佳答案
当使用 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"
列日期是基于列的分区,如果您尝试加载下一行
$ 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',
关于google-cloud-platform - Bigquery : Some rows belong to different partitions rather than destination partition,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59182899/