質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.42%
BigQuery

BigQueryは、Google Cloud Platformが提供しているビッグデータ解析サービス。数TB(テラバイト)またはPB(ペタバイト)の膨大なデータに対し、SQL風のクエリを実行し、高速で集計・分析を行うサービスです。

Google Cloud Platform

Google Cloud Platformは、Google社がクラウド上で提供しているサービス郡の総称です。エンドユーザー向けサービスと同様のインフラストラクチャーで運営されており、Webサイト開発から複雑なアプリ開発まで対応可能です。

Google Cloud Storage

Google Cloud Storageは、グーグル社が提供しているクラウドベースのデベロッパー・企業向けストレージサービス。可用性に優れ、APIで操作可能なため、データのアーカイブ保存やアプリケーションのコンテンツ提供など様々な用途に活用できます。

Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Q&A

解決済

1回答

251閲覧

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

mleo21

総合スコア4

BigQuery

BigQueryは、Google Cloud Platformが提供しているビッグデータ解析サービス。数TB(テラバイト)またはPB(ペタバイト)の膨大なデータに対し、SQL風のクエリを実行し、高速で集計・分析を行うサービスです。

Google Cloud Platform

Google Cloud Platformは、Google社がクラウド上で提供しているサービス郡の総称です。エンドユーザー向けサービスと同様のインフラストラクチャーで運営されており、Webサイト開発から複雑なアプリ開発まで対応可能です。

Google Cloud Storage

Google Cloud Storageは、グーグル社が提供しているクラウドベースのデベロッパー・企業向けストレージサービス。可用性に優れ、APIで操作可能なため、データのアーカイブ保存やアプリケーションのコンテンツ提供など様々な用途に活用できます。

Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

0グッド

0クリップ

投稿2023/12/07 07:41

実現したいこと

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},
}
など試してみましたが、上記エラーメッセージが出力されてうまくいきませんでした。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

BigQueryのスキーマを事前定義して、それに合うようにjsonデータのスキーマを手書きしました。
少し形は異なりましたが、格納することができました。

投稿2023/12/08 08:36

mleo21

総合スコア4

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.42%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問