【问题标题】:For Bigquery table schemas, how do I change a column's mode from NULLABLE to REQUIRED?对于 Bigquery 表模式,如何将列的模式从 NULLABLE 更改为 REQUIRED?
【发布时间】:2021-02-10 07:53:43
【问题描述】:
我在 BigQuery 中有一个表,想将列的模式从 NULLABLE 更改为 REQUIRED。
根据用于修改 BigQuery 表架构的 Google 文档,执行此操作的唯一方法如下:“您可以通过将表数据导出到 Cloud Storage,然后将数据加载到新表中来手动更改列的模式为列指定正确模式的模式定义。您还可以使用加载作业覆盖现有表。 (https://cloud.google.com/bigquery/docs/manually-changing-schemas#changing_a_columns_mode)。
我对此有 2 个问题。
-
最后一句“您也可以使用加载作业覆盖现有表”是什么意思?这是否意味着我可以以某种方式在现有表中更改此架构,而实际上不必创建新表?
-
我想避免创建新表,而只是对现有表进行架构更改。 有没有办法在我现有的表中将列的模式从 NULLABLE 更改为 REQUIRED? 对于其他修改,例如从表架构中删除列或更改列的数据类型,可以使用查询工作(文档中的选项1)。还有我可以做的查询作业来更改列的模式吗? BigQuery 似乎不支持“ALTER TABLE [Table] ALTER COLUMN [Column] INTEGER NOT NULL”之类的内容。
感谢任何帮助!
【问题讨论】:
标签:
google-cloud-platform
google-bigquery
【解决方案2】:
您需要阅读的文档的重要部分是修改表模式,更准确地说是 Relaxing a column mode 部分。在那里你可以看到这两条关键线:
意思是,无法将 NULLABLE 列更改为 REQUIRED,但您可以将 REQUIRED 列更改为 NULLABLE。
无论如何我都尝试进行更改,所有架构更改,如上述官方文档所示,可以使用 bq 更新、调用 table.patch 方法或使用客户端库来完成。我在this other post 中对其进行了更广泛的描述。在任何情况下,当将架构中的列从 NULLABLE 修改为 REQUIRED 并尝试更新时,都会遇到错误:
BigQuery error in update operation: Provided Schema does not match Table <project-id>:<dataset-id>.<table-id>. Field <field-name> has changed mode from NULLABLE to REQUIRED
不支持确认。
但是,您可以按照第一个问题中提到的解决方法,即加载覆盖相同命名表的数据。
基本上,步骤是:
- 导出到 GCS
- 加载数据覆盖同一张表
我做了一个快速的实验来仔细检查它是否正常工作。
- 我将数据导出到 GCS using the UI 中的 CSV 文件。
- 我覆盖了Appending to or overwriting a table with CSV data 后面的表格。基本上我使用了命令:
bq load \
--source_format=CSV \
--replace \
--max_bad_records=3 \
<dataset-id>.<table-id> \
gs://<MyBucket>/<myexportedfile> \
<mymodifiedschemafile>
因此,我得到了与之前相同的表,但字段从 NULLABLE 更改为 REQUIRED,确认此解决方法正常工作!