在时间分区的bigquery表中,何时将数据写入__UNPARTITIONED__?有什么影响?

Ran*_*ech 4 google-bigquery

我遇到了一些时间分区的bigquery表格的未记录的未记录行为:

我在BigQuery中创建了一个时间分区表并插入了数据.我能够正常插入 - 数据写入今天的分区(我也能够明确指定分区并写入其中)

在对新数据进行一些测试之后,我删除了今天的分区,以获得干净的数据:(CLI)

bq --project_id=my-project rm v1.mytable$20160613
Run Code Online (Sandbox Code Playgroud)

然后我检查它是否为空:

select count(*) from [v1.mytable]
Run Code Online (Sandbox Code Playgroud)

结果 270而不是0

我再次尝试删除并重新运行查询 - 相同的结果.所以我问了

select count(*) from [v1.mytable$20160613]
Run Code Online (Sandbox Code Playgroud)

结果 0

所以我可能已插入数据的几个日期,但都是0.最后我跑了

SELECT partition_id from [v1.mytable$__PARTITIONS_SUMMARY__];
Run Code Online (Sandbox Code Playgroud)

结果

{ UNPARTITIONED 20160609 20160613}

并且所有数据实际上都是在UNPARTITIONED中

我的问题:

  1. 何时将数据写入此特殊分区而不是每日分区,如何避免这种情况?
  2. 是否有其他影响,除了失去解决特定日期(在查询中,或删除数据等)的能力?我应该照顾这个案子吗?

Pav*_*ara 7

  1. 虽然数据位于流缓冲区中,但它仍保留在UNPARTITIONED分区中.要在查询中处理此分区,可以对_PARTITIONTIME伪列使用NULL值.

    SELECT ... FROM mydataset.mypartitioned_table WHERE _PARTITIONTIME IS NULL

  2. 要删除给定分区的数据,我们建议使用返回空结果的查询对其执行写截断.例如:

    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 |
+-----+
Run Code Online (Sandbox Code Playgroud)


Ran*_*ech 5

这是一个临时状态——一个小时后查询所有记录都属于今天的分区。

因此效果类似于数据写入的延迟:插入后立即查询可能没有正确分区中的最新数据,但最终这将是可以的