首页 文章

BigQuery上的Delta工作错过了记录

提问于
浏览
0

我面临一个奇怪的问题,我在一个使用Apache Beam的流式BigQuery表上实现了一个小型delta工作 .

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

CreatedDatetime >= LastDeltaDate AND
CreatedDatetime < NowUTC

LastDeltaDate的逻辑如下:

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
...

现在每隔一天我都会在流式传输表上找到记录,但从未到达我的对帐表 . 当我检查时间戳时,我发现它们远离批处理运行,当我检查Google Datflow日志时,我可以看到当时没有为查询返回的记录,但是当我现在运行相同的查询时,我得到了记录 . 流式记录是否有任何方式可以在查询中超级到达,或者Apache Beam是否可以处理记录但是不能长时间写入记录?我没有应用任何窗口策略 .

有任何想法吗?

1 回答

  • 1

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

    因此,在T2时刻,您可能已将一堆行流式传输到BigQuery中,这些行存储在流式缓冲区中 . 然后,您可以从时间T1到T2运行批处理作业,但只能查看直到T2缓冲区的行 . 因此,将删除每个增量运行的缓冲区中的所有行 .

    您可能需要让您选择NowUTC了解流缓冲区,以便下一次运行处理缓冲区内的行 .

相关问题