我遇到了一些时间分区的bigquery表格的未记录的未记录行为:
我在BigQuery中创建了一个时间分区表并插入了数据。 我能够正常插入 - 数据被写入今天的分区(我也能够明确指定分区并写入其中)
使用新数据进行一些测试后,我删除了今天的分区,以获得干净的数据:(CLI)
bq --project_id=my-project rm v1.mytable$20160613
然后我检查它是否为空:
select count(*) from [v1.mytable]
结果 270而不是0
我再次尝试删除并重新运行查询 - 结果相同。 所以我查询了
select count(*) from [v1.mytable$20160613]
结果 0
所以我可能已插入数据的前几个日期,但都是0。 最后我跑了
SELECT partition_id from [v1.mytable$__PARTITIONS_SUMMARY__];
结果
{ UNPARTITIONED 20160609 20160613}
所有数据实际上都是 UNPARTITIONED
我的问题:
答案 0 :(得分:7)
虽然数据位于流缓冲区中,但它仍保留在UNPARTITIONED分区中。要在查询中解决此分区,可以对_PARTITIONTIME伪列使用值NULL。
SELECT ... FROM mydataset.mypartitioned_table WHERE _PARTITIONTIME IS NULL
要删除给定分区的数据,我们建议使用返回空结果的查询对其执行写截断。例如:
bq query --destination_table=mydataset.mypartitionedtable\$20160121 --replace 'SELECT 1 as field1, "one" as field2 FROM (SELECT 1 as field1, "one" as field2) WHERE FALSE'
请注意,分区仍然存在(如果从表$ __ PARTITIONS__SUMMARY执行SELECT *),但它将有0行。
$ bq query 'SELECT COUNT(*) from [mydataset.mypartitionedtable$20160121]'
+-----+
| f0_ |
+-----+
| 0 |
+-----+
答案 1 :(得分:3)
这是一个临时状态 - 一小时后查询记录都属于今天的分区。
因此效果类似于数据写入的延迟:在插入后立即查询可能没有正确分区中的最新数据,但最终这将是正常的