100% ローカル — データがブラウザの外に出ることはありません

JSONをBigQueryスキーマに変換|bq loadがそのまま通る

JSONのサンプルをBigQueryのスキーマファイルに変換します。すべての行のフィールドが統合されるので、読み込みは三度目ではなく一度目でそのまま成功します。

高速 プライベート Cookieゼロ
インデント

JSON 入力

BigQuery 出力

このツールの動作

JSON の標本が BigQuery のスキーマファイルになります。bq load --schema が受け取る、項目記述の配列です。

{ "id": 1, "firstName": "Ada", "address": { "city": "Paris" } }
[
  { "name": "id", "type": "INTEGER", "mode": "REQUIRED" },
  { "name": "firstName", "type": "STRING", "mode": "REQUIRED" },
  {
    "name": "address",
    "type": "RECORD",
    "mode": "REQUIRED",
    "fields": [{ "name": "city", "type": "STRING", "mode": "REQUIRED" }]
  }
]

項目名は JSON の鍵をそのまま保ちます。BigQuery が許すのは英字、数字、下線で、たいていの鍵はすでにその範囲です。

すべての行を、最初の一つだけでなく

[{ "a": 1 }, { "a": 2, "b": "x" }]
[
  { "name": "a", "type": "INTEGER", "mode": "REQUIRED" },
  { "name": "b", "type": "STRING", "mode": "NULLABLE" }
]

スキーマは最初のオブジェクトだけから読まれていたので、あなた自身の標本の残りを読み込むと no such field: b で失敗しました。今は項目がすべてのオブジェクトにわたって束ねられ、どこかに無いものは NULLABLE になります。実際にそうだからです。

本物の欠陥で、この文章を書く過程で見つけ、下の二つとともに直しました。

フィールドと一緒に型も統合されます。ある行で INTEGER、次の行で STRING になるキーは JSON の列になります。STRING では読み込みのときに数値が弾かれるからです。一方、オブジェクトどうしは一つの RECORD に統合され、片方に無いサブフィールドはそこで NULLABLE になります。

型の混ざった配列は JSON の列

{ "arr": [1, "x"] }
[{ "name": "arr", "type": "JSON", "mode": "NULLABLE" }]

繰り返し列の型は一つ、[1, "x"] の型は二つです。最初の要素から INTEGER REPEATED と決めれば、標本そのものが読み込めないスキーマができます。BigQuery の JSON 型は値をそのまま持ちます。混ざった配列と、配列の配列がそれになります。整数と小数だけが混ざっている場合は、両方を覆う FLOAT の繰り返し列のままです。

二つの推測、名指しで

  • null は STRING NULLABLE になります。 標本が見せたのは鍵だけで、型ではありません。STRING は選択であって読み取りではありません。その項目が数値なら、最初の読み込みの前に変えてください。
  • 空の配列は STRING REPEATED になります。 理屈は同じで、中に何も無かったからです。どちらもあなたの標本は問題なく読み込めます。そして項目の中身が分かったら、どちらも見直す値打ちがあります。

JSONをBigQueryに読み込む

噛み合わせるものが三つあります。噛み合っていないとき、BigQuery はそのどれもはっきりとは教えてくれません。

一行に一件。 BigQuery が読み込むのは改行区切りの JSON であって、JSON の配列ではありません。ファイルが [ で始まっていれば読み込みは通りません。ここの NDJSON 変換が、まさにその変換です。

スキーマは別のファイルに。 上の配列を schema.json として保存します。データファイルの一部ではなく、そこから読み取られることもありません。

bq load \
  --source_format=NEWLINE_DELIMITED_JSON \
  --schema=schema.json \
  mydataset.mytable \
  data.ndjson

あるいは API で。 同じ配列を、読み込みジョブ設定の schema.fields に置きます。ファイルでも API でも中身は同じです。

プライバシー

すべての処理はブラウザ内のJavaScriptだけで完結します。データがアップロードされることはないため、機密情報でも安心して利用でき、オフラインでも動作します。

よくある質問

なぜ型の混ざった配列が JSON の列になったのですか。
それを収められる繰り返し列が無いからです。`[1, "x"]` は最初の要素から `INTEGER REPEATED` と型付けされ、その同じ標本の読み込みが二つ目で失敗していました。BigQuery には値をそのまま持てる `JSON` 型があります。混ざった配列にはそれを与えます。型のそろった配列は、今までどおりその型の繰り返し列です。
最初の行には必ずある項目が、なぜ NULLABLE なのですか。
別の行に無いからです。スキーマは標本のすべてのオブジェクトの和であり、一部に無い項目を REQUIRED にはできません。読み込みがその行を拒むからです。最初のオブジェクトだけを読んでいた頃は、残りが «no such field» で失敗するスキーマが出ていました。
このファイルはどう使いますか。
`bq load --source_format=NEWLINE_DELIMITED_JSON --schema=schema.json mydataset.mytable data.ndjson` です。スキーマはデータの中ではなく、その隣に置く独立したファイルです。API を使う場合は、同じ配列を `schema.fields` に置きます。

関連ツール