从 Bigquery 中的查询复制表

Posted

技术标签:

【中文标题】从 Bigquery 中的查询复制表【英文标题】:Copy tables from query in Bigquery 【发布时间】:2016-10-04 08:40:44 【问题描述】:

我正在尝试修复字段类型错误(但不包含数据)的 Bigquery 表的架构。我想使用 UI (select * except(bad_column) from ...) 将数据从旧模式复制到新模式。

问题是:

如果我选择一个表,Bigquery 将删除所需的列,因此拒绝插入。 通过 json 导出会丢失日期信息。

有没有比创建一个所有列都可以为空/重复的新表或手动转换所有数据更好的解决方案?

【问题讨论】:

您可能已经看到了这一点,但如果没有看到,旧版到标准 SQL 的迁移指南建议了几种处理 REQUIRED 到 NULLABLE 转换的方法:cloud.google.com/bigquery/sql-reference/…。 【参考方案1】:

更新(2018 年 6 月 20 日):BigQuery 现在支持标准 SQL 中查询输出的必填字段,并且从 2017 年年中开始支持。

具体来说,如果您将查询结果附加到具有必填字段的架构的表中,则该架构将被保留,并且 BigQuery 将在写入结果时检查它是否包含空值。如果您想将结果写入一个全新的表,您可以创建一个具有所需架构的空表并附加到该表。


过时:

您有多种选择:

    将您的字段类型更改为可为空。标准 SQL 仅返回可为空的字段,这是预期的行为,因此今后将字段标记为必需的可能不太有用。

    您可以使用旧版 SQL,它将保留必填字段。不能使用except,但可以显式选择所有其他字段。

    您可以使用所需的架构导出和重新导入。

您提到通过 JSON 导出会丢失日期信息。你能澄清一下吗?如果您指的是分区日期,那么不幸的是,我认为上述任何解决方案都会将所有数据折叠到今天的分区中,除非您使用 table$yyyymmdd 语法明确插入到命名分区中。 (这可行,但如果您的数据分布在多个日期,则可能需要大量操作。)

【讨论】:

导出到 json 会丢失日期的精度 - 格式是一秒精度的指数。有一些功能可以保持进动。 随着表大小的增加,导出数据将变得越来越困难。 我们最终放弃了非空规范。 更新:BigQuery 现在支持查询输出中的必填字段。【参考方案2】:

BigQuery 现在支持表克隆功能。表克隆是另一个表的轻量级、可写副本

Copy tables from query in Bigquery

【讨论】:

以上是关于从 Bigquery 中的查询复制表的主要内容,如果未能解决你的问题,请参考以下文章

BigQuery“复制表”不适用于小表

BigQuery - 在 UI 上复制表格 - 不复制所有表格

在流数据仍在缓冲区中时复制 bigquery 表

有没有办法在 bigquery 中删除表列?

BigQuery 表分区

对两个不同用户的 BigQuery 数据访问权限,无需复制数据