BigQuery 范围装饰器重复问题
BigQuery range decorator duplicate issue
我们在流式处理 table 上遇到 BigQuery 运行ge 装饰器的问题。 运行ge 装饰器查询提供重复数据。
我的情况:
我的 BQ table 通过流式插入定期从客户事件中获取数据。另一个作业是使用 运行ge 装饰器定期从 table 获取时间绑定数据并将其发送到数据流作业。喜欢
第一次使用
从table获取所有数据
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]
给出空数据。
有什么帮助吗?
首先,您是否尝试过使用流式数据流?这可能更合适(尽管您的逻辑无法表达为查询)。流式数据流还支持 Tee-ing 您的写入,因此您可以保留原始数据和聚合结果。
关于你的问题:
不幸的是,这是两个同时构建且有些独立的概念的冲突,因此导致定义不明确的交互。
时间范围 table 装饰器 designed/built 在一个 仅 加载作业存在的世界中。因此,数据块在单个时间点以原子方式提交给 table。时间范围装饰器在这方面工作得很好,因为 inclusion/exclusion 有明确的边界,关系是 stable.
Streaming Ingestion + 实时查询在某种程度上与 "load job" 世界背道而驰。 BigQuery 会将您的数据缓冲一段时间,使其可供分析,然后使用传统存储方式定期将缓冲区刷新到 table。当数据被缓冲时,我们有 "infinite" 时间粒度。但是,一旦我们将缓冲区刷新到 table,无限粒度被压缩为一个时间,即当前的刷新时间。
因此,在流 table 上使用时间范围装饰器可能会不幸地导致一些意外行为,因为相同的数据可能会出现在两个非重叠时间 windows(一次是缓冲的, 并在刷新时一次)。
如果您尝试对近期数据进行 windowed 查询,我们的建议是执行以下操作:
- 在您的数据中包含系统时间戳。
- 对于 table 装饰器时间戳,在实际 window 周围包含一些缓冲区,以解决您的时钟和 Google 之间的时钟偏差,以及重试的延迟到达。这个缓冲区应该在你的目标 window.
之前和之后
- 修改您的查询以应用您的实际时间 window。
需要注意的是,根据您的实际使用目的,这可能无法解决您的问题。如果您能提供更多详细信息,可能有一种方法可以实现您的需求。
对于给您带来的不便,我们深表歉意。
我们在流式处理 table 上遇到 BigQuery 运行ge 装饰器的问题。 运行ge 装饰器查询提供重复数据。
我的情况:
我的 BQ table 通过流式插入定期从客户事件中获取数据。另一个作业是使用 运行ge 装饰器定期从 table 获取时间绑定数据并将其发送到数据流作业。喜欢
第一次使用
从table获取所有数据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]
给出空数据。
有什么帮助吗?
首先,您是否尝试过使用流式数据流?这可能更合适(尽管您的逻辑无法表达为查询)。流式数据流还支持 Tee-ing 您的写入,因此您可以保留原始数据和聚合结果。
关于你的问题:
不幸的是,这是两个同时构建且有些独立的概念的冲突,因此导致定义不明确的交互。
时间范围 table 装饰器 designed/built 在一个 仅 加载作业存在的世界中。因此,数据块在单个时间点以原子方式提交给 table。时间范围装饰器在这方面工作得很好,因为 inclusion/exclusion 有明确的边界,关系是 stable.
Streaming Ingestion + 实时查询在某种程度上与 "load job" 世界背道而驰。 BigQuery 会将您的数据缓冲一段时间,使其可供分析,然后使用传统存储方式定期将缓冲区刷新到 table。当数据被缓冲时,我们有 "infinite" 时间粒度。但是,一旦我们将缓冲区刷新到 table,无限粒度被压缩为一个时间,即当前的刷新时间。
因此,在流 table 上使用时间范围装饰器可能会不幸地导致一些意外行为,因为相同的数据可能会出现在两个非重叠时间 windows(一次是缓冲的, 并在刷新时一次)。
如果您尝试对近期数据进行 windowed 查询,我们的建议是执行以下操作:
- 在您的数据中包含系统时间戳。
- 对于 table 装饰器时间戳,在实际 window 周围包含一些缓冲区,以解决您的时钟和 Google 之间的时钟偏差,以及重试的延迟到达。这个缓冲区应该在你的目标 window. 之前和之后
- 修改您的查询以应用您的实际时间 window。
需要注意的是,根据您的实际使用目的,这可能无法解决您的问题。如果您能提供更多详细信息,可能有一种方法可以实现您的需求。
对于给您带来的不便,我们深表歉意。