BigQuery 范围装饰器重复问题

Posted

技术标签:

【中文标题】BigQuery 范围装饰器重复问题【英文标题】:BigQuery range decorator duplicate issue 【发布时间】:2015-12-17 06:13:28 【问题描述】:

我们在流式表上遇到了 BigQuery 范围装饰器的问题。范围装饰器查询给出重复数据。

我的情况:

我的 BQ 表通过流式插入定期从客户事件中获取数据。另一个作业是使用范围装饰器定期从表中获取时间限制数据并将其发送到数据流作业。喜欢

第一次使用从表中获取所有数据

SELECT * FROM [project_id:alpha.user_action@1450287482158]

当我运行这个查询时,得到了 91 条记录..

15 分钟后基于最后一个时间间隔的另一个查询

SELECT * FROM [alpha.user_action@1450287482159-1450291802380]

这也给出了相同的结果,有 91 条记录。

但是我尝试再次运行相同的查询以进行交叉检查

SELECT * FROM [project_id:alpha.user_action@1450287482158]

给出空数据。

有什么帮助吗?

【问题讨论】:

【参考方案1】:

首先,您是否尝试过使用流式数据流?这可能更合适(尽管您的逻辑无法表达为查询)。流式数据流还支持对您的写入进行 Tee,因此您可以保留原始数据和汇总结果。

关于你的问题:

不幸的是,这是两个同时构建且在某种程度上独立构建的概念的冲突,从而导致了定义不明确的交互。

时间范围表装饰器是在加载作业存在的世界中设计/构建的。因此,数据块在单个时间点以原子方式提交到表中。时间范围装饰器很好地处理了这一点,因为包含/排除的界限很明确,并且关系是稳定的。

流式摄取 + 实时查询在某种程度上与“加载作业”世界背道而驰。 BigQuery 将您的数据缓冲一段时间,使其可用于分析,然后使用传统存储方式定期将缓冲区刷新到表中。当数据被缓冲时,我们有“无限”的时间粒度。但是,一旦我们将缓冲区刷新到表上,那无限的粒度就会被压缩为一个时间,也就是当前的刷新时间。

因此,不幸的是,在流式表上使用时间范围装饰器可能会导致一些意外行为,因为相同的数据可能会出现在两个不重叠的时间窗口中(一次在缓冲时,一次在刷新时)。

如果您尝试对最近的数据进行窗口查询,我们的建议是执行以下操作:

    在您的数据中包含系统时间戳。 对于表装饰器时间戳,在实际窗口周围包含一些缓冲区,以解决您的时钟与 Google 的时钟之间的时钟偏差,以及重试后的延迟到达。此缓冲区应位于目标窗口之前和之后。 修改您的查询以应用您的实际时间窗口。

需要注意的是,根据您的实际使用目的,这可能无法解决您的问题。如果您可以提供更多详细信息,则可能有一种方法可以实现您的需求。

很抱歉给您带来不便。

【讨论】:

感谢您的详细回答,由于价格限制,我们没有采用流式数据流。顺便说一句,我们为此场景选择了加载作业。 一个合理的选择取决于你的限制!还要提到其他一些事情:1)每天的负载工作限制,所以一定要适当地限制你的负载。否则,您可能会在一天的后半段遇到配额失败。 2)如果你对查询最新数据不感兴趣,有一个表装饰器可以与时间范围装饰器(tablename@123-456%-s)结合使用,它将省略流缓冲区中的数据。

以上是关于BigQuery 范围装饰器重复问题的主要内容,如果未能解决你的问题,请参考以下文章

Bigquery 表装饰器 绝对时间使用

是否可以使用“$”装饰器访问标准 SQL 中的 BigQuery 分区?

Bigquery LegacySQL 使用特殊装饰器及时的无效快照@0

Big Query @0 表装饰器

我们如何删除由表装饰器创建的 bigquery 快照?

修复表格装饰器错误后我们应该做些啥不同的事情?