はじめに
GolangでBigQueryをざつに扱っています。
GolangでGCSにおいたCSVデータをBigQueryに取り込むメモです。
この記事のサンプルコードは以下においてあります。
アジェンダ
1. サンプルコード
いきなり本題ですが、サンプルコードです。
※ constでProjectID, Dataset, Table, GcsURIは指定していますがサンプルコードでは省いています。
func main() { // client ctx := context.Background() client, err := bigquery.NewClient(ctx, projectID) if err != nil { log.Printf("err: %+v", err) } defer client.Close() // create table from gcs csv gcsRef := bigquery.NewGCSReference(GcsURI) gcsRef.SkipLeadingRows = 1 gcsRef.Schema = bigquery.Schema{ {Name: "id", Required: true, Type: bigquery.StringFieldType}, {Name: "name", Required: true, Type: bigquery.StringFieldType}, {Name: "age", Required: true, Type: bigquery.IntegerFieldType}, } loader := client.Dataset(dataset).Table(table).LoaderFrom(gcsRef) loader.WriteDisposition = bigquery.WriteEmpty job, err := loader.Run(ctx) if err != nil { log.Printf("err: %+v", err) } status, err := job.Wait(ctx) if err != nil { log.Printf("err: %+v", err) } if status.Err() != nil { log.Printf("job completed with error: %v", status.Err()) } }
2. 要点
Golangで普通にBigQueryのschema指定 + Table作成にGCSのデータをかませる感じです。
gcsRef := bigquery.NewGCSReference(GcsURI)
でGCSReference
structを生成し、それをもとにごにょごにょする感じです。
また、Schemaはjsonファイルなどからも生成できます。
以下をご参照ください。
3. 確認
GCS CSVからBigQueryにデータ取り込み
$ go run main.go
tableを確認
$ bq show --format=prettyjson your-project:sample_csv_dataset.sample_csv_table { "creationTime": "1619006997787", "etag": "LfUpW/GsO3bWS5M3GW/cBQ==", "id": "your-project:sample_csv_dataset.sample_csv_table", "kind": "bigquery#table", "lastModifiedTime": "1619006997787", "location": "US", "numBytes": "51", "numLongTermBytes": "0", "numRows": "3", "schema": { "fields": [ { "mode": "REQUIRED", "name": "id", "type": "STRING" }, { "mode": "REQUIRED", "name": "name", "type": "STRING" }, { "mode": "REQUIRED", "name": "age", "type": "INTEGER" } ] }, "selfLink": "https://bigquery.googleapis.com/bigquery/v2/projects/your-project/datasets/sample_csv_dataset/tables/sample_csv_table", "tableReference": { "datasetId": "sample_csv_dataset", "projectId": "your-project", "tableId": "sample_csv_table" }, "type": "TABLE" }
データを確認
$ bq query --use_legacy_sql=false 'SELECT id, name, age FROM your-project.sample_csv_dataset.sample_csv_table' Waiting on bqjob_r2039930c1e6e05d_00000178f45820d3_1 ... (0s) Current status: DONE +----+------+-----+ | id | name | age | +----+------+-----+ | 1 | hoge | 20 | | 2 | fuga | 25 | | 3 | piyo | 30 | +----+------+-----+
おわりに
意外とサクッとできますね!