【问题标题】:In time-partitioned bigquery tables, when is data written to __UNPARTITIONED__? what are the effects?在时间分区的 bigquery 表中,数据何时写入_UNPARTITIONED_?有什么影响?
【发布时间】:2016-06-13 14:44:18
【问题描述】:

我遇到了时间分区 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__];

结果

{ 未分区 20160609 20160613 }

所有的数据实际上都在UNPARTITIONED

我的问题:

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

【问题讨论】:

标签: google-bigquery


【解决方案1】:
  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'

请注意,分区仍然存在(如果您从 table$__PARTITIONS__SUMMARY 执行 SELECT *),但它将有 0 行。

$ bq query 'SELECT COUNT(*) from [mydataset.mypartitionedtable$20160121]'

+-----+
| f0_ |
+-----+
|   0 |
+-----+

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2021-11-09
      • 1970-01-01
      • 2022-01-22
      • 2020-09-30
      • 1970-01-01
      • 1970-01-01
      • 2013-06-12
      • 2019-07-17
      • 1970-01-01
      相关资源
      最近更新 更多