100 % lokal — Ihre Daten verlassen nie Ihren Browser

JSON in BigQuery-Schema — bq load nimmt es an

Ein JSON-Beispiel in eine BigQuery-Schemadatei verwandeln. Die Felder aller Zeilen werden zusammengeführt — der Ladevorgang klappt beim ersten Versuch.

Sofort Privat Null Cookies
Einrückung

JSON-Eingabe

BigQuery-Ausgabe

Was dieses Werkzeug tut

Aus einer JSON-Probe wird eine BigQuery-Schemadatei — das Array von Feldbeschreibungen, das bq load --schema erwartet.

{ "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" }]
  }
]

Die Feldnamen behalten die JSON-Schlüssel — BigQuery erlaubt Buchstaben, Ziffern und Unterstriche, was die meisten Schlüssel ohnehin sind.

Jede Zeile, nicht nur die erste

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

Das Schema wurde bisher allein vom ersten Objekt abgelesen, also scheiterte das Laden des Rests Ihrer eigenen Probe mit no such field: b. Die Felder werden nun über alle Objekte vereint, und eines, das irgendwo fehlt, ist NULLABLE — das ist es ja.

Ein echter Fehler, beim Schreiben dieser Seite gefunden und behoben, zusammen mit den beiden folgenden.

Mit den Feldern werden auch die Typen zusammengeführt. Derselbe Schlüssel, in einer Zeile INTEGER und in der nächsten STRING, bekommt eine JSON-Spalte — STRING würde die Zahl beim Laden abweisen. Zwei Objekte dagegen verschmelzen zu einem RECORD, und ein Unterfeld, das auf einer Seite fehlt, ist dort NULLABLE.

Ein gemischtes Array ist eine JSON-Spalte

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

Eine wiederholte Spalte hat einen Typ, und [1, "x"] hat zwei. Sie nach dem ersten Element zu typen — INTEGER REPEATED — ergab ein Schema, in das die Probe selbst nicht lädt. BigQuerys JSON-Typ trägt den Wert, wie er ist; den bekommen gemischte Arrays und Arrays von Arrays. Ganzzahlen und Dezimalzahlen gemischt bleiben ein wiederholtes FLOAT, das beide deckt.

Zwei Vermutungen, benannt

  • null wird STRING NULLABLE. Die Probe zeigt einen Schlüssel und keinen Typ; STRING ist eine Wahl, keine Lesung. Ist das Feld eine Zahl, ändern Sie es vor dem ersten Laden.
  • Ein leeres Array wird STRING REPEATED. Dieselbe Begründung: es war nichts darin. Beides lädt Ihre Probe anstandslos, und beides verdient einen zweiten Blick, sobald Sie das Feld kennen.

JSON in BigQuery laden

Drei Dinge müssen zusammenpassen, und BigQuery benennt keines davon klar, wenn sie es nicht tun.

Ein Objekt je Zeile. BigQuery lädt zeilengetrenntes JSON, kein JSON-Array. Beginnt Ihre Datei mit [, lädt sie nicht — der NDJSON-Konverter hier macht genau diese Umwandlung.

Das Schema in einer eigenen Datei. Speichern Sie das Array oben als schema.json. Es gehört nicht in die Datendatei und wird auch nicht aus ihr gelesen.

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

Oder über die API. Dasselbe Array steht unter schema.fields der Ladejob-Konfiguration — Datei und API nehmen denselben Inhalt.

Datenschutz ab Werk

Alles läuft lokal in deinem Browser mit JavaScript. Deine Daten werden nie hochgeladen, wodurch das Tool auch für sensible Inhalte sicher ist und offline funktioniert.

Häufige Fragen

Warum wurde mein gemischtes Array eine JSON-Spalte?
Weil keine wiederholte Spalte es fassen kann. `[1, "x"]` wurde nach dem ersten Element `INTEGER REPEATED` getypt — und das Laden genau dieser Probe scheiterte am zweiten. BigQuery hat einen nativen `JSON`-Typ, der den Wert nimmt, wie er ist; den bekommt ein gemischtes Array. Ein gleichartiges bleibt eine wiederholte Spalte seines Typs.
Warum ist ein Feld NULLABLE, das meine erste Zeile immer hat?
Weil eine andere Zeile es nicht hat. Das Schema ist die Vereinigung aller Objekte der Probe, und ein Feld, das manchen fehlt, kann nicht REQUIRED sein: das Laden wiese jene Zeilen ab. Nur das erste Objekt zu lesen ergab ein Schema, das am Rest mit „no such field“ scheiterte.
Wie benutze ich die Datei?
`bq load --source_format=NEWLINE_DELIMITED_JSON --schema=schema.json mydataset.mytable data.ndjson`. Das Schema steht in einer eigenen Datei, neben den Daten statt in ihnen; über die API steht dasselbe Array unter `schema.fields`.

Ähnliche Konverter