BigQuery上で複数の異なるデータソース間でJOINとかしたいことがある。それをする方法。
以下のようなCSVがGCS上に用意されているとする。
people.csv
name,age
jessy,25
thomas,30
brian,34
tommy,33
このCSVのデータをBigQuery上でテーブルっぽく使うには以下のような実装をする。
// スキーマフィールドを定義
nameSchema := bigquery.FieldSchema{
Name: "name",
Required: true,
Type: bigquery.StringFieldType,
}
ageSchema := bigquery.FieldSchema{
Name: "age",
Required: true,
Type: bigquery.IntegerFieldType,
}
// GCSをBigQuery上で外部データソースとして使うための設定を定義
gcsSrcConfig := bigquery.ExternalDataConfig{
SourceFormat: bigquery.CSV,
SourceURIs: []string{"gs://your-gcp-project/somewhere/somedirectory/people.csv"},
Schema: []*bigquery.FieldSchema{
&nameSchema,
&ageSchema,
},
}
// CSV上のデータをdataOnGcsとして指定しSQL文で使う
q := client.Query(`select * from dataOnGcs`)
q.TableDefinitions = map[string]bigquery.ExternalData{
"dataOnGcs": &gcsSrcConfig,
}
ExternalDataConfig
にAutoDetect
というオプションがあり、これをtrueにすると自動でCSVのデータ構造からスキーマを推測してくれると書いてあったのだが、これをtrueにしてもselect文とかで指定できなかった。やはりSchema
に自前でスキーマ定義を渡してやるのが必要そうだ。
GCS以外にもJSONやGoogleスプレッドシートをデータソースとして使えるらしい。ええやん。