Google bigquery BigQuery上的增量作业未命中记录

Google bigquery BigQuery上的增量作业未命中记录,google-bigquery,google-cloud-dataflow,apache-beam,Google Bigquery,Google Cloud Dataflow,Apache Beam,我在使用ApacheBeam在流式BigQuery表上实现的一个小增量作业中遇到了一个奇怪的问题 我将数据流传输到BigQuery表,每小时运行一个作业,将任何新记录从该流传输表复制到已协调的表。delta构建在我在流表中引入的CreateDatetime列之上。一旦记录加载到流表中,它将获得当前UTC时间戳。因此,delta自然会获取所有CreateDatetime比上次更新的记录,直到批处理运行的当前时间 CreatedDatetime >= LastDeltaDate AND Cre

我在使用ApacheBeam在流式BigQuery表上实现的一个小增量作业中遇到了一个奇怪的问题

我将数据流传输到BigQuery表,每小时运行一个作业,将任何新记录从该流传输表复制到已协调的表。delta构建在我在流表中引入的CreateDatetime列之上。一旦记录加载到流表中,它将获得当前UTC时间戳。因此,delta自然会获取所有CreateDatetime比上次更新的记录,直到批处理运行的当前时间

CreatedDatetime >= LastDeltaDate AND
CreatedDatetime < NowUTC
现在,每隔一天,我都会在我的流媒体表中找到一些记录,但这些记录从未出现在我的对账表中。当我检查时间戳时,我看到它们远离批处理运行,当我检查Google Datflow日志时,我可以看到当时没有为查询返回任何记录,但当我现在运行相同的查询时,我得到了记录。流式记录是否有可能在查询中超晚到达,或者Apache Beam是否有可能正在处理一条记录,但很长一段时间没有写入它?我没有应用任何窗口策略


有什么想法吗?

执行流式插入时,这些行可用于批量导出的速度会有延迟,如文档中所述

因此,在时间T2,您可能已经将一组行流式传输到BigQuery中,这些行存储在流式缓存中。然后从时间T1到T2运行批处理作业,但只能看到T2 buffer之前的行。因此,每个增量运行的缓冲区中的所有行都将被删除


您可能需要让您选择的NowUTC知道流式缓冲区,以便下次运行时处理缓冲区内的行。

您如何确定LastDeltaDate?@BenChambers我已更新了我的问题,并说明了如何确定LastDeltaDate。谢谢。我记得在某个地方读到,对于查询,流式缓冲区中的数据将立即可用,但我猜BigQueryIO不算作查询?我猜增量日期在BigQuery中不起作用,因为人们不能依赖时间戳,因为不幸的是BigQuery表没有默认值。我看到的唯一其他选择是始终将流式处理表与已对账的表进行比较,以复制任何新记录。您还想做什么吗?您可以尝试只向上扫描表中的全部内容,而不必一直扫描到现在。看起来这最多是90分钟。如果您发出table.get调用,它还将为您提供流式缓冲区的属性,包括streamingBuffer.oldesentrytime—其中最早条目的时间戳。如果您使用它而不是NowUTC,您将不会跳过缓冲区中当前的行,下次应该扫描它们。在批处理中,BigQueryIO执行导出操作,然后从GCS读取文件,因为这提高了并行性。不幸的是,streamingBuffer.oldestEntryTime没有多大帮助,因为如果我在流表上选中它,最早的记录是14个多小时前。在另一个很少使用的表上,它甚至已经运行了3天,它似乎在90分钟内没有清空缓冲区,或者没有更新信息?这更令人困惑,我在使用BigQueryIO运行Beam作业之前和之后监视表上的流缓冲区统计。缓冲区包含11条记录,但增量作业将它们全部复制到下一个表中。回到这里,这要么意味着统计数据是错误的,要么BigQueryIO毕竟是在进行查询?
1. Start: LastDeltaDate = 2017-01-01 00:00:00
2. 1st Delta Run: 
- NowUTC = 2017-10-01 06:00:00
- LastDeltaDate = 2017-01-01 00:00:00
- at the end of the successful run LastDeltaDate = NowUTC
3. 2nd Delta Run:
- NowUTC = 2017-10-01 07:00:00
- LastDeltaDate = 2017-10-01 06:00:00
- at the end of the successful run LastDeltaDate = NowUTC
...