Google bigquery 重新创建BigQuery表后,流式插入是否不起作用?

Google bigquery 重新创建BigQuery表后,流式插入是否不起作用?,google-bigquery,Google Bigquery,我刚刚遇到了一个关于BigQuery的有趣问题 本质上,有一个批处理作业,它在BigQuery中重新创建一个表——删除数据——然后立即开始通过流接口输入一个新的集合 曾经像这样工作了很长一段时间——很成功 最近它开始松动数据 一个小的测试用例已经证实了这种情况——如果数据馈送在重新创建(成功!)表之后立即启动,数据集的部分内容将丢失。 也就是说,在输入的4000条记录中,只有2100-3500条能够通过 我怀疑在表操作(删除和创建)在整个环境中成功传播之前,表创建可能会返回成功,因此数据集的第一

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

本质上,有一个批处理作业,它在BigQuery中重新创建一个表——删除数据——然后立即开始通过流接口输入一个新的集合

曾经像这样工作了很长一段时间——很成功

最近它开始松动数据

一个小的测试用例已经证实了这种情况——如果数据馈送在重新创建(成功!)表之后立即启动,数据集的部分内容将丢失。 也就是说,在输入的4000条记录中,只有2100-3500条能够通过

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

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

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

过去对这个超时没有要求。我们正在使用我们的BigQuery。 我是不是漏掉了什么明显的东西


编辑:根据下面Sean Chen和其他一些来源提供的评论,这种行为是预期的,因为表是缓存的,内部表id是通过系统传播的。BigQuery是为仅追加类型的操作生成的。重新写入不是设计中可以轻松适应的事情,应该避免。

由于BigQuery流式服务器缓存表生成id(表的内部名称)的方式,这或多或少是意料之中的事情

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


一种解决方法是截断表,而不是删除表。您可以通过运行
SELECT*FROM LIMIT 0
,并将该表作为目标表(您可能希望使用allow\u large\u results=true并禁用展平,如果您有嵌套数据,这将有所帮助),然后使用write\u disposition=write\u TRUNCATE。这将清空表,但保留模式。之后流式处理的任何行都将应用于同一个表。

您到底在使用什么来标识“表创建成功”?好的一点-我可能在这里做了一个假设-bigquery.tables().delete(_projectId,_datasetId,_tableName).execute();我实际上检查了getLastStatusCode-它在3分钟内不会更改(我在想,它是否可以像BigQuery作业那样运行—客户端应该检查几次作业是否已完成。不—似乎不是这样。写入截断实际上会产生相同的行为。在流式处理之前,您需要等待>2分钟,以避免数据被丢弃。我应该注意,这应该有我的行为已经持续了约1年。嗨,肖恩,我也遇到了类似的问题,等了200秒,但数据似乎仍在丢失,有什么想法吗?有没有比在流媒体播放前等待约2分钟更好的方法?@Sean这是我正在经历的行为,但我至少要等待400万秒。你们找到解决办法了吗?我明白了这可能是一个基础设施限制,但文档中甚至没有建议这样做。