大查询 Table 上次修改时间戳与上次 table 插入时间不对应

Big Query Table Last Modified Timestamp does not correspond to time of last table insertion

我有一个 table, rising-ocean-426:metrics_bucket.metrics_2015_05_09

根据节点 js API,正在检索此 table、

的元数据
Table was created       Sat, 09 May 2015 00:12:36 GMT-Epoch 1431130356251
Table was last modified Sun, 10 May 2015 02:09:43 GMT-Epoch 1431223783125

根据我的记录,对此 table 的最后一批插入实际上是在:

Sun, 10 May 2015 00:09:36 GMT - Epoch 1431216576000.

这比报告的最后修改时间早两个小时。使用 table 装饰器,我可以证明在 Epoch 1431216576000 之后的 table 中没有插入任何记录,证明在我最后一次批量插入和最后一次修改时间之间的最后两个小时没有插入任何记录在元数据中报告:

The query: SELECT
count(1) as count
FROM [metrics_bucket.metrics_2015_05_09@1431216577000-1431223783125];

returns 零计数。而查询:

SELECT
count(1) as count
FROM [metrics_bucket.metrics_2015_05_09@1431216576000-1431216577000];

returns count: 222,891

这表明正确的最后修改时间是 2015 年 5 月 10 日星期日 00:09:36 GMT,而不是元数据断言的 02:09:43 GMT。

我正在尝试以编程方式生成一个 FROM 子句,该子句跨越多个带有装饰器的 table,因此我需要 table 的准确创建和最后修改时间以确定装饰器何时可以被省略,因为时间范围跨越了整个table。但是,由于这个时间差异,我无法消除 table 装饰器。

问题是,我是否在查看正确的元数据以获得正确的创建和最后修改信息?

简答:您确实在查看正确的元数据。

长答案: 最后修改时间包括一些数据内部压缩的时间,与数据更改无关。使用以 1431223783125 或 1431216576000 结尾的装饰器对您的 table 执行查询会产生相同的结果,就像您的实验显示的那样,但稍后执行包括我们的存储效率改进,可能 略微 提高执行时间和效率。我们认为这是一个错误,并将很快将 API 更新为 return 上次用户修改时间。

与此同时,除了添加的查询文本之外,包含 table 并非真正需要的装饰器并没有什么坏处。查询成本或性能都不会改变。