我刚遇到BigQuery一个有趣的问题。
本质上,存在一个批处理作业,该作业在BigQuery中重新创建了一个表-删除了数据-然后立即开始通过流式接口输入新的数据集。
曾经这样工作了一段时间-成功。
最近,它开始丢失数据。
一个小的测试用例已证实了这种情况–如果在重新创建(成功!)表后立即开始数据馈送,则数据集的某些部分将丢失。也就是说,在要送入的4000条记录中,只有2100-3500条可以通过。
我怀疑在成功将表操作(删除和创建)传播到整个环境之前,表创建可能会返回成功,因此数据集的第一部分将被馈送到表的旧副本(在此处进行推测)。
为了确认这一点,我在表创建和开始数据馈送之间设置了超时时间。实际上,如果超时时间少于120秒,则会丢失部分数据集。
如果超过120秒-似乎可以正常运行。
过去没有此超时的要求。我们正在使用美国BigQuery。我是否在这里遗漏了一些明显的东西?
编辑:从下面的Sean Chen提供的评论以及其他一些来源-由于表被缓存的方式以及内部表ID在整个系统中传播的方式,这种行为是可以预期的。BigQuery已针对仅追加类型的操作而构建。改写并不是很容易适应设计的事情,应该避免。
由于BigQuery流传输服务器缓存表生成ID(表的内部名称)的方式,因此或多或少会出现这种情况。
您能否提供有关用例的更多信息?删除表然后再次写入同一表似乎很奇怪。
一种解决方法是截断表,而不是删除表。您可以通过运行SELECT * FROM <table> LIMIT 0
,并将表作为目标表来执行此操作(您可能希望使用allow_large_results = true并禁用展平,如果您有嵌套数据,这将有所帮助),然后使用write_disposition = WRITE_TRUNCATE。这将清空表,但保留架构。然后,任何随后流式传输的行都将应用于同一表。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句