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

时间:2016-04-05 00:45:11

标签: google-bigquery

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

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

用这种方式工作已有一段时间 - 成功。

最近它开始放松数据。

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

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

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

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

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

编辑:从Sean Chen提供的评论和其他一些来源 - 由于表的缓存方式和内部表ID通过系统传播,预计会出现这种情况。 BigQuery是为仅附加类型的操作而构建的。重写不是人们可以容易地适应设计的东西,应该避免。

1 个答案:

答案 0 :(得分:6)

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

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

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