为流式插入自动创建 BQ 表

Posted

技术标签:

【中文标题】为流式插入自动创建 BQ 表【英文标题】:Auto-create BQ tables for streaming inserts 【发布时间】:2014-02-17 13:51:55 【问题描述】:

也许我弄错了:有没有办法为 tabledata.insertAll 命令自动创建目标表?如果是,请指出我正确的方向。

如果不是 - 创建所需表的最佳方法是什么?在启动时检查现有表并通过从 GCS 加载创建不存在的表?还是可以直接从代码创建而不需要加载作业?

我定义了许多事件类(Python 云端点),完美的解决方案是使用这些定义来创建匹配的 BQ 表。

【问题讨论】:

【参考方案1】:

由于 BigQuery 不知道架构,因此无法在流式传输期间自动创建表。您发布的 JSON 数据没有类型信息——如果有一个字段“123”,我们不知道它是否始终是一个字符串,或者它是否实际上应该是一个整数。此外,如果您发布的数据缺少可选字段,则创建的架构会比您想要的更窄。

创建表的最佳方法是使用 tables.insert() 调用(无需运行加载作业来从 GCS 加载数据)。您可以准确地提供您想要的架构,并且一旦创建了表,您就可以将数据流式传输到它。

在某些情况下,客户会预先创建一个月的表格,因此他们只需每 30 天担心一次。在其他情况下,您可能需要在启动时检查表是否存在,如果不存在,请创建它。

【讨论】:

谢谢。我最终在应用程序启动时检查了哪些表存在(tables.list),然后通过执行将零数据选择到新表中的查询来创建丢失的表(插入) 这也有效。如果您不想插入空白行,可以执行以下操作:SELECT * from (SELECT 0 as foo, "" as bar) WHERE false,这将创建一个空结果但带有架构。 @JordanTigani 还有,创建表后是否有宽限期?我发现在我们的流过程中创建表后我们正确地丢失了数据,并且 API 没有给我们任何异常或错误。 在数据首次流式传输到表和数据可供查询之间有大约 5 分钟的“预热”时间。当您停止流式传输到表超过 24 小时然后重新开始时,此预热时间也适用。我们正在努力缩短预热时间。

以上是关于为流式插入自动创建 BQ 表的主要内容,如果未能解决你的问题,请参考以下文章

在将数据插入突触表数据类型时自动从 Varchar 转换为 Text

自动创建表并从 json 文件插入数据

如何在 Java 中为自动增量表创建查询?

创建一个名为stu_insert的触发器,当向学生表student中插入记录时,自动更新班级表class中的学生人数numbe

MySQL创建表时,设置时间字段自动插入当前时间的两种格式

为已有表快速创建自动分区和Long类型like 的方法-Oracle 11G