Go言語でGCSからBigQueryにjsonデータを1つのフィールドに格納したい。

実現したいこと

jsonデータをGCSからBigQueryに流し込みたいです。
その際に、jsonデータをBigQueryの1つのフィールド(データタイプはjson)に格納したいです。

前提

Cloud Functionsの第2世代で開発しています。
ランタイムはGoの1.21です。
GCSに格納しているjsonファイルはjsonl型です。
このjsonlファイルには100行ほどのログデータが入っています。
このログデータを1行ずつBigQueryの1つのフィールドに格納したいです。
ログデータのカラムは可変のため、スキーマ定義などはしたくありません。

BigQueryのテーブルのスキーマ
フィールド名:log
種類:json
モード:nullable

発生している問題・エラーメッセージ

Error while reading data, error message: JSON table encountered too many errors, giving up. Rows: 1; errors: 1. Please look into the errors[] collection for more details. File: gs://"gcspath"

該当のソースコード

func.go

1package function 2 3import ( 4 "context" 5 "log" 6 "os" 7 8 "cloud.google.com/go/bigquery" 9 "github.com/GoogleCloudPlatform/functions-framework-go/functions" 10 "cloud.google.com/go/storage" 11) 12 13func init() { 14 functions.HTTP("DataImport", dataImport) 15} 16 17func dataImport(w http.ResponseWriter, r *http.Request) { 18 19 20 //gcs to bigquery 21 bigqueryCtx := context.Background() 22 bigqueryClient, err := bigquery.NewClient(bigqueryCtx, os.Getenv("projectID")) 23 if err != nil { 24 log.Fatalf("err: %v", err) 25 } 26 defer bigqueryClient.Close() 27 28 gcsRef := bigquery.NewGCSReference("gs://" + os.Getenv("bucketName") + "/" + os.Getenv("filePath")) 29 gcsRef.SourceFormat = bigquery.JSON 30 loader := bigqueryClient.Dataset(os.Getenv("datasetID")).Table(os.Getenv("tableID")).LoaderFrom(gcsRef) 31 loader.WriteDisposition = bigquery.WriteAppend 32 33 job, err := loader.Run(ctx) 34 if err != nil { 35 log.Fatal(err) 36 } 37 status, err := job.Wait(ctx) 38 if err != nil { 39 log.Fatal(err) 40 } 41 42 if status.Err() != nil { 43 log.Fatal(err) 44 } 45 46}

あるべきBigQueryの姿

行 log
1 {"age":22,"citiesLived":[{"numberOfYears":5,"place":"Seattle"},
{"numberOfYears":6,"place":"Stockholm"}],"name":"John","gender":"Male","kind":"person"}
2 {"age":24,"citiesLived":[{"numberOfYears":5,"place":"Seattle"},
{"numberOfYears":6,"place":"Stockholm"}],"name":"Smith","gender":"Male","kind":"person"}
3


データはサンプルです。

試したこと

gcs.AutoDetect = false
gcsRef.Schema = bigquery.Schema{
{Name: "log", Type: bigquery.JSONFieldType},
}
など試してみましたが、上記エラーメッセージが出力されてうまくいきませんでした。

コメントを投稿

0 コメント