Qué hace esta herramienta
Una muestra JSON pasa a ser un archivo de esquema de BigQuery: el array de descripciones de campo que espera 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" }]
}
]
Los nombres de campo conservan las claves JSON: BigQuery admite letras, dígitos y guiones bajos, que es lo que la mayoría de las claves ya son.
Todas las filas, no solo la primera
[{ "a": 1 }, { "a": 2, "b": "x" }]
[
{ "name": "a", "type": "INTEGER", "mode": "REQUIRED" },
{ "name": "b", "type": "STRING", "mode": "NULLABLE" }
]
El esquema se leía solo del primer objeto, así que cargar el resto de tu propia muestra fallaba con no such field: b. Ahora los campos se unen sobre todos los objetos, y el que falta en alguno es NULLABLE, que es lo que es.
Era un defecto real, encontrado al escribir esta página y corregido, junto con los dos de abajo.
Los tipos se funden junto con los campos. Una clave tipada INTEGER en una fila y STRING en la siguiente recibe una columna JSON: STRING rechazaría el número al cargar. Dos objetos, en cambio, se funden en un solo RECORD, y un subcampo que falte en un lado queda ahí NULLABLE.
Un array mezclado es una columna JSON
{ "arr": [1, "x"] }
[{ "name": "arr", "type": "JSON", "mode": "NULLABLE" }]
Una columna repetida tiene un tipo, y [1, "x"] tiene dos. Tiparlo según el primer elemento —INTEGER REPEATED— producía un esquema en el que la propia muestra no carga. El tipo JSON de BigQuery lleva el valor tal cual: eso reciben los arrays mezclados y los arrays de arrays. Enteros y decimales mezclados siguen siendo un FLOAT repetido, que cubre ambos.
Dos suposiciones, dichas
nullpasa aSTRING NULLABLE. La muestra enseña una clave y ningún tipo; STRING es una elección, no una lectura. Si el campo es un número, cámbialo antes de la primera carga.- Un array vacío pasa a
STRING REPEATED. Mismo razonamiento: no había nada dentro. Ambas cargan tu muestra sin problema, y ambas merecen una segunda mirada cuando conozcas el campo.
Cargar tus datos JSON en BigQuery
Tres cosas tienen que encajar, y BigQuery no nombra ninguna con claridad cuando no encajan.
Un objeto por línea. BigQuery carga JSON delimitado por saltos de línea, no un array JSON. Si tu archivo empieza por [, no cargará: el conversor NDJSON de aquí hace justo esa conversión.
El esquema en su propio archivo. Guarda el array de arriba como schema.json. No forma parte del archivo de datos ni se deduce de él.
bq load \
--source_format=NEWLINE_DELIMITED_JSON \
--schema=schema.json \
mydataset.mytable \
data.ndjson
O por la API. El mismo array va bajo schema.fields de la configuración del trabajo de carga: el archivo y la API esperan el mismo contenido.
Privado por diseño
Todo se ejecuta localmente en tu navegador con JavaScript. Tus datos nunca se suben a un servidor, lo que hace que la herramienta sea segura para contenido sensible y funcione sin conexión.