google-bigquery - 架构修改导致分区错误
问题描述
我之前在 terraform 中使用以下脚本在 bigquery 中创建了一个表
resource "google_bigquery_dataset" "my-dataset" {
dataset_id = "datasetname"
description = "description"
}
resource "google_bigquery_table" "mytable" {
dataset_id = google_bigquery_dataset.my-dataset.dataset_id
table_id = "mytable"
time_partitioning {
type = "DAY"
}
schema = <<EOF
[
{
"name": "field_one",
"type": "STRING",
"mode": "NULLABLE"
},
{
"name": "field_two",
"type": "RECORD",
"mode": "NULLABLE",
"fields": [
{
"name": "sub_field_one",
"type": "FLOAT",
"mode": "NULLABLE"
},
{
"name": "sub_field_two",
"type": "FLOAT",
"mode": "NULLABLE"
}
]
},
{
"name": "field_three",
"type": "STRING",
"mode": "NULLABLE"
}
]
EOF
}
这工作正常,我能够mytable
在 bigquery 中创建。现在我必须修改这个表并且必须向它添加一个新值(field_four
。所以制作了这个脚本
resource "google_bigquery_dataset" "my-dataset" {
dataset_id = "datasetname"
description = "description"
}
resource "google_bigquery_table" "mytable" {
dataset_id = google_bigquery_dataset.my-dataset.dataset_id
table_id = "mytable"
time_partitioning {
type = "DAY"
}
schema = <<EOF
[
{
"name": "field_one",
"type": "STRING",
"mode": "NULLABLE"
},
{
"name": "field_two",
"type": "RECORD",
"mode": "NULLABLE",
"fields": [
{
"name": "sub_field_one",
"type": "FLOAT",
"mode": "NULLABLE"
},
{
"name": "sub_field_two",
"type": "FLOAT",
"mode": "NULLABLE"
}
]
},
{
"name": "field_three",
"type": "STRING",
"mode": "NULLABLE"
},
{
"name": "field_four",
"type": "RECORD",
"mode": "NULLABLE",
"fields": [
{
"name": "sub_field_three",
"type": "STRING",
"mode": "NULLABLE"
}
]
}
]
EOF
}
当我使用 运行它时terraform plan
,它显示将添加新字段。但是当我这样做时terraform apply
,我得到以下错误
Error: googleapi: Error 400: Cannot convert non partitioned/clustered table to partitioned/clustered table., invalid
on filename.tf line 10, in resource "google_bigquery_table" "mytable":
10: resource "google_bigquery_table" "mytable" {
我没有更改表的分区。这里发生了什么。如何使架构更改为
- 添加新字段?
- 将字段类型(目前只有
null
值)更改为新的?
地形细节
Terraform v0.12.24
+ provider.google v3.1.0
+ provider.google-beta v3.1.0
+ provider.random v2.2.1
解决方案
复制相同的代码后,我可以毫无问题地添加一个新字段。正如评论中所讨论的,当您尝试将非分区表转换为分区表时,会引发以下错误。在这种情况下,问题是由版本不匹配引起的Terraform
:用于创建表的版本不支持分区表,因此创建了一个普通表。在 Terraform 0.12.24 中运行这两个代码时,它可以工作。
Error: googleapi: Error 400: Cannot convert non partitioned/clustered table to partitioned/clustered table., invalid
on filename.tf line 10, in resource "google_bigquery_table" "mytable":
10: resource "google_bigquery_table" "mytable" {
关于第二个问题,您不能使用 Terraform 更改字段的类型。正如您在此处看到的,要更改字段的类型,您需要一个查询作业,这在 Terraform 中是不可能的,正如您在这个未解决的问题中看到的那样。
我希望它有帮助
推荐阅读
- php - 我可以根据 URL 显示单一视图的不同部分吗?
- apache-kafka - 如何获取 Apache kafka 正在使用的配置文件名
- json - 使用数组解组 JSON
- powershell - 在 powershell 脚本中为 Nintex 设置凭据以迁移到 O365
- c# - 我在字符串的末尾得到了价值
- php - 从 URL 运行脚本时来自 cpanel 重新调整错误的 Cron 作业没有重新运行任何错误
- opencv - OpenMP 的结果令人失望
- git - 从 Azure DevOps 克隆存储库时出现致命错误
- javascript - 尝试使用希伯来语字符从 html 导出 PDF
- javascript - 在我的 index.html 中需要逻辑来呈现来自服务的信息