我刚刚遇到了BigQuery的一个有趣的问题.
基本上有一个批处理作业在BigQuery中重新创建一个表 - 删除数据 - 然后立即开始通过流接口提供新的集合.
曾经这样工作很长一段时间 - 成功.
最近它开始松散数据.
一个小的测试用例已经确认了这种情况 - 如果数据源在重新创建(成功!)表后立即启动,则数据集的某些部分将丢失.即在被输入的4000条记录中,只有2100 - 3500可以通过.
我怀疑在表操作(删除和创建)在整个环境中成功传播之前,表创建可能会返回成功,因此数据集的第一部分将被提供给表的旧副本(在此推测).
为了确认这一点,我在表创建和启动数据馈送之间设置了超时.实际上,如果超时小于120秒 - 部分数据集将丢失.
如果超过120秒 - 似乎工作正常.
以前没有要求超时.我们正在使用美国BigQuery.我错过了一些明显的东西吗?
编辑:从下面的肖恩陈提供的评论和一些其他来源 - 由于表的缓存方式和内部表id传播到整个系统的方式,行为是预期的.BigQuery是为仅附加类型的操作而构建的.重写不是人们可以容易地适应设计的东西,应该避免.
由于BigQuery流服务器缓存表生成ID(表的内部名称)的方式,这或多或少是预期的.
您能否提供有关用例的更多信息?删除表然后再次写入同一个表似乎很奇怪.
一种解决方法可能是截断表,而不是删除它.您可以通过运行来执行此操作SELECT * FROM <table> LIMIT 0
,并将表作为目标表(您可能希望使用allow_large_results = true并禁用展平,这将有助于嵌套数据),然后使用write_disposition = WRITE_TRUNCATE.这将清空表但保留模式.然后,之后流式传输的任何行都将应用于同一个表.
归档时间: |
|
查看次数: |
1289 次 |
最近记录: |