tweeeetyのぶろぐ的めも

アウトプットが少なかったダメな自分をアウトプット<br>\(^o^)/

【BigQuery】GolangでGCSのCSVデータからBigQueryにデータを取り込むメモ

はじめに

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 |
+----+------+-----+

おわりに

意外とサクッとできますね!