bigquery 的 time_partitioning_expiration 参数如何工作?

How bigquery's time_partitioning_expiration parameter work?

我创建了一个分区类型为 day 的 table,并且我已通过 bq 命令行工具将 time_partitioning_expiration 设置为 1209600 秒(14 天)。我已经通过 运行 bq show 在 table 上验证了设置是否正确,我可以看到

"timePartitioning": {
    "expirationMs": "1209600000", 
    "type": "DAY"
  }, 
  "type": "TABLE"

然而,分区中似乎有我预计已被删除的数据。

SELECT 
  count(*) as c,
  _partitiontime as pDate
FROM [poc.reporting]
group by pDate
; 

1   373800  2016-07-17 00:00:00 UTC  
2   640800  2016-07-18 00:00:00 UTC  
3   373800  2016-07-16 00:00:00 UTC  

我的理解是设置 time_partition_expiration 将 remove/delete 分区在内部正确吗?如果是这样,为什么我的情况没有删除分区?

分区的到期时间不是基于分区的日期,而是基于存储准确添加到 table 的时间。因此,例如,对于分区到期时间为 14 天的 table,如果分区 20160717 的数据在 20160730 重述,则该分区的数据将从 20160730 起到期 14 天。您可以验证最旧数据的写入时间在分区中使用以下查询:

SELECT MSEC_TO_TIMESTAMP(creation_time) from [project:dataset.table$__PARTITIONS_SUMMARY__]

Pavan 的最佳答案中描述的行为似乎在 2016 年 12 月 13 日发生了变化,到期时间现在基于分区日期,而不是最后修改日期。

来自最新的文档:

For example, if the partition expiration is set to 60 days and data is written to partition 20170101 on January 30, 2017, then the data expires on January 1, 2017 + 60 days.

参考:BQ Partitioned Tables