やりたいこと
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できずに非常に困っていました。
手順としては
- ネイティブテーブルを作成する。
- 作成したネイティブテーブルにデータを流し込む
で問題なくいけました。
データ基盤を構築する上でデータが日々追加されるテーブルは多いのでこの