BigQuery范围装饰器重复问题

时间:2015-12-17 06:13:28

标签: google-bigquery

我们在流表上面临着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 个答案:

答案 0 :(得分:2)

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

关于你的问题:

不幸的是,这是两个同时构建且有些独立的概念的碰撞,从而导致不明确的交互。

时间范围表装饰器是在仅存在 装载作业的世界中设计/构建的。因此,数据块在单个时间点以原子方式提交给表。时间范围装饰器对此非常有效,因为包含/排除有明确的界限,并且关系是稳定的。

Streaming Ingestion +实时查询与“加载作业”世界有些相反。 BigQuery在一段时间内缓冲您的数据,使其可用于分析,然后使用传统的存储方式定期将缓冲区刷新到表中。在缓冲数据的同时,我们具有“无限”的时间粒度。但是,一旦我们将缓冲区刷新到表上,就会将无限粒度压缩到一个时间,这是当前的刷新时间。

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

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

  1. 在数据中包含系统时间戳。
  2. 对于表装饰器时间戳,在实际窗口周围包含一些缓冲区,以解决时钟和谷歌之间的时钟偏差,以及重试后到达的时间。此缓冲区应该在目标窗口之前和之后。
  3. 修改您的查询以应用您的实际时间窗口。
  4. 应该注意的是,根据您的实际使用目的,这可能无法解决您的问题。如果您可以提供更多详细信息,可能有办法实现您的需求。

    很抱歉给您带来不便。