0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

BigQueryをTerraformで作成する時につまずいたポイント

Posted at

やりたいこと

BigQueryでCSVファイルをアップロードしたり、Google Spread Sheetを参照してテーブルを作成することはよくありますよね?そして作成したテーブルに対してレコードをappendしたりします。

そこで、Terraformでリソースを作成する際に色々躓いたのでここに記載します。

結論

google_bigquery_jobを使用して、予め作成しておいたネイティブテーブルにデータをロードさせます。外部テーブルとして作成してしまうとデータを流すことができませんのでご注意ください。

resource "google_bigquery_dataset" "default" {
  dataset_id                  = "foo"
  friendly_name               = "test"
  description                 = "This is a test description"
  location                    = "EU"
  default_table_expiration_ms = 3600000

  labels = {
    env = "default"
  }
}

resource "google_bigquery_table" "default" {
  dataset_id = google_bigquery_dataset.default.dataset_id
  table_id   = "bar"
}

resource "google_bigquery_job" "job" {
  job_id     = "job_query"

  load {
    destination_table {
      project_id = google_bigquery_table.default.project
      dataset_id = google_bigquery_table.default.dataset_id
      table_id   = google_bigquery_table.default.table_id
    }

    source_uris = ["gs://${google_storage_bucket.~}"]

    source_format         = "CSV"
    skip_leading_rows     = 1
    allow_quoted_newlines = true
    field_delimiter       = ","
    quote                 = "\""
    autodetect            = true
    write_disposition = "WRITE_TRUNCATE"
  }
}

問題

ドキュメントにあるようなexternal_data_configurationといったコードを使用すると外部テーブルとして作成してしまうので、データはappendできません。

実際のエラーはこんな形です。

DML statements are only supported over tables that have data stored in BigQuery. Unsupported table:~~~

external_data_configurationを使ったコードはこちらです。

resource "google_bigquery_table" "default" {
  dataset_id = google_bigquery_dataset.default.dataset_id
  table_id   = "bar"

  time_partitioning {
    type = "DAY"
  }

  labels = {
    env = "default"
  }

  schema = <<EOF
[
  {
    "name": "permalink",
    "type": "STRING",
    "mode": "NULLABLE",
    "description": "The Permalink"
  },
  {
    "name": "state",
    "type": "STRING",
    "mode": "NULLABLE",
    "description": "State where the head office is located"
  }
]
EOF

}

resource "google_bigquery_table" "sheet" {
  dataset_id = google_bigquery_dataset.default.dataset_id
  table_id   = "sheet"

  external_data_configuration {
    autodetect    = true
    source_format = "GOOGLE_SHEETS"

    google_sheets_options {
      skip_leading_rows = 1
    }

    source_uris = [
      "https://docs.google.com/spreadsheets/d/123456789012345",
    ]
  }
}

まとめ

Terraformのドキュメントをパッと見たときにはBigQueryは外部テーブルとして作成する使い方しか記載がなく、データを溜める時にappdendできずに非常に困っていました。

手順としては

  1. ネイティブテーブルを作成する。
  2. 作成したネイティブテーブルにデータを流し込む

で問題なくいけました。

データ基盤を構築する上でデータが日々追加されるテーブルは多いのでこの

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?