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
nullwirdSTRING 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.