如何批量向Ingestion Time分区表追加数据并覆盖分区机制?
问题
目标表采用Ingestion Time分区(PARTITION BY DATE(_PARTITIONTIME)),有日志数据持续流入。现在需要加载同Schema的历史日志数据,要求这些历史数据基于指定TIMESTAMP列span.endTime的日期部分分区——保留分区ID的数据类型,但覆盖Ingestion Time的分区机制。使用bq load命令加载时触发分区不兼容错误:
加载命令:
bq --project_id=myProj \ load \ --time_partitioning_field=span.endTime \ --time_partitioning_type=DAY \ --source_format=PARQUET \ myDataset.test_junk \ gs://mybucket/test/export-*.parquet
错误信息:
E0419 17:06:29.304003 140704289732224 bq_utils.py:244] BigQuery error in load operation: Error processing job 'myProj:bqjob_r4bd44de633ecd32f_000001879b5714b9_1': Incompatible table partitioning specification. Expects partitioning specification interval(type:day), but input partitioning specification is interval(type:day,field:span.endTime)
请问除编写自定义代码外,是否有更简便的实现方法?
解决方案
无需编写自定义代码,可通过以下两种简便方法实现:
方法一:临时表中转
- 创建基于
span.endTime的临时分区表,加载历史数据:bq --project_id=myProj \ load \ --time_partitioning_field=span.endTime \ --time_partitioning_type=DAY \ --source_format=PARQUET \ myDataset.test_junk_temp \ gs://mybucket/test/export-*.parquet - 将临时表数据插入目标表,指定分区为
span.endTime的日期:INSERT INTO myDataset.test_junk PARTITION BY DATE(_PARTITIONTIME) SELECT * EXCEPT(_PARTITIONTIME), DATE(span.endTime) AS _PARTITIONTIME FROM myDataset.test_junk_temp - 清理临时表:
bq rm -f myDataset.test_junk_temp
- 创建基于
方法二:直接SQL加载插入
用bq query直接从GCS加载Parquet数据,同时指定分区值,无需临时表:INSERT INTO myDataset.test_junk PARTITION BY DATE(_PARTITIONTIME) SELECT * EXCEPT(_PARTITIONTIME), DATE(span.endTime) AS _PARTITIONTIME FROM `myProj.myDataset.test_junk` OPTIONS( format='PARQUET', uris=['gs://mybucket/test/export-*.parquet'] )
这两种方法都绕开了bq load的分区规则冲突问题,强制让历史数据按指定时间列的日期分区写入目标表,同时保留原表的Ingestion Time分区配置供后续实时数据使用。
内容的提问来源于stack exchange,提问作者Kevin
相关产品推荐
相关产品推荐

