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

2024-05-14 00:05:05 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

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

最近它开始松动数据

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

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

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

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

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

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


Tags: 数据编辑内容环境作业记录时间副本
1条回答
网友
1楼 · 发布于 2024-05-14 00:05:05

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

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

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

相关问题 更多 >