Модификация схемы с ошибкой разбиения - PullRequest
0 голосов
/ 03 апреля 2020

Я ранее создал таблицу в bigquery, используя следующий скрипт в terraform

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

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

1 Ответ

1 голос
/ 08 апреля 2020

После воспроизведения тех же кодов я мог бы без проблем добавить новое поле. Как обсуждалось в комментариях, ошибка ниже возникает, когда вы пытаетесь преобразовать однораздельную таблицу в многораздельную таблицу. В этом случае проблема была вызвана несоответствием версии 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, как вы можете видеть в этом открытом выпуске .

Я надеюсь, что это поможет

...