重新创建BigQuery表后,流插入不起作用?

Evg*_*ich 5 google-bigquery

我刚刚遇到了BigQuery的一个有趣的问题.

基本上有一个批处理作业在BigQuery中重新创建一个表 - 删除数据 - 然后立即开始通过流接口提供新的集合.

曾经这样工作很长一段时间 - 成功.

最近它开始松散数据.

一个小的测试用例已经确认了这种情况 - 如果数据源在重新创建(成功!)表后立即启动,则数据集的某些部分将丢失.即在被输入的4000条记录中,只有2100 - 3500可以通过.

我怀疑在表操作(删除和创建)在整个环境中成功传播之前,表创建可能会返回成功,因此数据集的第一部分将被提供给表的旧副本(在此推测).

为了确认这一点,我在表创建和启动数据馈送之间设置了超时.实际上,如果超时小于120秒 - 部分数据集将丢失.

如果超过120秒 - 似乎工作正常.

以前没有要求超时.我们正在使用美国BigQuery.我错过了一些明显的东西吗?

编辑:从下面的肖恩陈提供的评论和一些其他来源 - 由于表的缓存方式和内部表id传播到整个系统的方式,行为是预期的.BigQuery是为仅附加类型的操作而构建的.重写不是人们可以容易地适应设计的东西,应该避免.

Jor*_*ani 7

由于BigQuery流服务器缓存表生成ID(表的内部名称)的方式,这或多或少是预期的.

您能否提供有关用例的更多信息?删除表然后再次写入同一个表似乎很奇怪.

一种解决方法可能是截断表,而不是删除它.您可以通过运行来执行此操作SELECT * FROM <table> LIMIT 0,并将表作为目标表(您可能希望使用allow_large_results = true并禁用展平,这将有助于嵌套数据),然后使用write_disposition = WRITE_TRUNCATE.这将清空表但保留模式.然后,之后流式传输的任何行都将应用于同一个表.

  • Write truncate实际上会产生相同的行为.在流式传输之前,您需要等待> 2分钟,以避免数据被丢弃.我应该注意到这应该是约1年的行为. (4认同)
  • 有什么比在直播前等待约 2 分钟更好的方法吗?@肖恩陈 (3认同)