基于 TIMESTAMP 列的分区的 BigQuery 分区到期

Posted

技术标签:

【中文标题】基于 TIMESTAMP 列的分区的 BigQuery 分区到期【英文标题】:BigQuery partition expiration for TIMESTAMP column based partition 【发布时间】:2018-03-04 00:29:16 【问题描述】:

我正在尝试在我设置了基于 TIMESTAMP 列的分区的表上测试分区过期。问题是分区过期似乎不起作用。

这是我的工作:

1) 使用 TIMESTAMP 列分区和 60 秒过期时间创建表

bq mk --table --project_id cool_project-007 --time_partitioning_field ts --time_partitioning_expiration 60  --schema ts:TIMESTAMP,label_1:STRING  dataset_sample.sample_x

2) 从列类型相同的其他表中,我选择 ALL 并将值复制/附加到新创建的表 sample_x

3) 我希望所有 ts (TIMESTAMP) 超过 60 秒的记录都将被删除。但他们不是!

请问,我做错了什么?

【问题讨论】:

【参考方案1】:

与表过期一样,分区过期是由周期性后台进程完成的,因此表/分区不会在过期时立即过期。它们在后台进程扫描时被删除。通常人们将它设置为几个月或至少几天,所以这个小的延迟不是问题。

好消息是我们已更改为从查询结果中过滤掉过期的分区。它将在一两周内发布。

【讨论】:

完美 - 这是有道理的。最好在官方文档中提及这一点,但是在您提到的新功能发布后,这个问题应该是历史了:)。谢谢! 很高兴知道,但我遇到了一个问题,我有一天到期但我的查询返回最后两个数据分区? DAY (expirationMs: 86400000) 你能发个工作ID让我们看看吗? @HuaZhang 我知道这有点老了,但我找不到您在此处提到的功能:“好消息是我们已更改为从查询结果中过滤掉过期的分区。它将在一两周内被释放。” - 有吗? 这不是公共功能。这是 2018 年推出的内部实现。【参考方案2】:

好问题 - 我认为您和之前的答案误解了 TIMESTAMP 列的分区! 即使它是用于分区的 TIMESTAMP 列 - 分区本身仍然是 DAY -

按 timestamp_column 分区 — 使用 TIMESTAMP 列的日期对表进行分区

你可以看到更多here

这意味着您不应该期望 ts (TIMESTAMP) 超过 60 秒的所有记录都会被删除。相反,这应该在相应一天结束后 60 秒发生

【讨论】:

好点。过期是在分区上,而不是在单个记录上。所以一条记录只有在它所属的日期分区过期时才会过期。我之前的回答仍然存在,因为当天分区不会在当天结束后的 60 秒内被删除。就像即使您写到去年的某一天,它也只会在后台进程扫描时被删除。分区/表过期主要是为了通过删除旧数据来降低存储成本。最好在查询中显式过滤记录。 同意 - 它仅“在某种意义上......”但总的来说我认为它不能回答特定的 OP 问题 :o)

以上是关于基于 TIMESTAMP 列的分区的 BigQuery 分区到期的主要内容,如果未能解决你的问题,请参考以下文章

分区表中未分区的旧行

基于组 ID 子集的时间戳列的组中的最后一行 - Postgres

java.sql.date , java.sql.timestamp 谓词 -> Oracle 分区数据类型

将 spark current_timestamp 值推送到带有 timezone 列的 postgres 时间戳

使用 BQ API 使用 Write_Truncate 将数据加载到“分区表”

同一记录中列的 DB2 Max Timestamp