首页 > 解决方案 > 架构修改导致分区错误

问题描述

我之前在 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" {

我没有更改表的分区。这里发生了什么。如何使架构更改为

  1. 添加新字段?
  2. 将字段类型(目前只有null值)更改为新的?

地形细节

Terraform v0.12.24
+ provider.google v3.1.0
+ provider.google-beta v3.1.0
+ provider.random v2.2.1

标签: google-bigqueryterraform

解决方案


复制相同的代码后,我可以毫无问题地添加一个新字段。正如评论中所讨论的,当您尝试将非分区表转换为分区表时,会引发以下错误。在这种情况下,问题是由版本不匹配引起的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 中是不可能的,正如您在这个未解决的问题中看到的那样。

我希望它有帮助


推荐阅读