BigQuery 将查询结果附加到具有必填字段的表中

Posted

技术标签:

【中文标题】BigQuery 将查询结果附加到具有必填字段的表中【英文标题】:BigQuery append results of query to table with Required fields 【发布时间】:2016-09-09 16:16:52 【问题描述】:

我正在尝试将查询结果附加到与查询结果具有相同架构的现有表中,但现有表中的某些字段是必需的。

这是我尝试运行查询时所有必填字段的错误:

Invalid schema update. Field user has changed mode from REQUIRED to NULLABLE

当我将查询结果写入新表时,它的所有字段都具有相同的名称和类型,但是所有字段的模式都是 NULLABLE(1 个重复字段除外)。我已经尝试对所有必填字段使用AND user IS NOT NULL,但没有成功。我还尝试将查询结果保存到单独的表中,然后修改其架构,但 BQ 不允许在表上追溯设置必填字段。

【问题讨论】:

【参考方案1】:

标准 SQL 不再支持必需字段。如果您使用的是标准 SQL(而不是旧版 SQL),他们建议您使用change all your REQUIRED fields to NULLABLE。

编辑(2017 年 10 月 23 日):看起来他们增加了对 REQUIRED fields in Standard SQL 的支持。

【讨论】:

该页面上的什么地方是这样写的? 呵呵,好像他们增加了对必填字段的支持:cloud.google.com/bigquery/docs/schemas#field_modes【参考方案2】:

FWIW,我发现使用模式创建表,然后查询它指定相同的模式,确实有效。像这样:

bq mk --schema=myschema.json me.newstuff &&
bq query --format=none --allow_large_results \
  --destination_table=me.newstuff \
  --destination_schema=myschema.json \
  --use_legacy_sql=false \
  "
    SELECT * FROM me.oldstuff
    WHERE data_to_keep is > 0
"

【讨论】:

【参考方案3】:

您无法更改查询结果的架构以将 NULLABLE 翻转为 REQUIRED,因此您唯一可以做的就是更改表的架构以将 REQUIRED 列转换为 NULLABLE(注意 - 如果您这样做,您将不会以后可以做相反的操作)。

【讨论】:

因此基本上不可能通过查询具有必填字段的表来追加到表中......这似乎有点疏忽。我能想到的唯一方法是将数据作为 CSV 导出到 GCS,然后执行加载工作。 在某些情况下查询产生 REQUIRED 字段是可能的,但一般情况下不会。在我看来,REQUIRED 弊大于利,所以我只需将架构更改为对所有字段都为 NULLABLE。 我的表已经生成并写入了 REQUIRED 字段,所以我无法真正切换现有的表。 您可以将现有表的架构从 REQUIRED 更改为 NULLABLE 而无需触及数据 - 这是一个兼容的架构更改。【参考方案4】:

当我使用bq load 命令加载时,我收到了相同的错误“字段已将模式从 REQUIRED 更改为 NULLABLE”。我解决的方法是更改​​架构。将字段从“REQUIRED”更改为“NULLABLE”

【讨论】:

以上是关于BigQuery 将查询结果附加到具有必填字段的表中的主要内容,如果未能解决你的问题,请参考以下文章

BigQuery SQL,将 SQL 查询结果附加到现有表

如何从具有字典列表的表中查询,仅针对某些键 (BigQuery) SQL

如何使用可重复对象中的嵌套必填字段将数据从一个表复制到另一个表

将数据附加到从 BigQuery 中的 Avro 文件创建的表中

BigQuery 命令行工具 - 使用查询附加到表

错误:时间戳字段的架构已更改(附加)