100 % local: tus datos nunca salen de tu navegador

JSON a esquema BigQuery — bq load lo acepta

Convierte una muestra JSON en un archivo de esquema BigQuery. Se fusionan los campos de todas las filas: la carga entra al primer intento, no al tercero.

Instantáneo Privado Cero cookies
Indentación

Entrada JSON

Salida BigQuery

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

  • null pasa a STRING 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.

Preguntas frecuentes

¿Por qué mi array mezclado pasó a ser una columna JSON?
Porque ninguna columna repetida puede contenerlo. `[1, "x"]` salía como `INTEGER REPEATED`, según el primer elemento, y la carga de esa misma muestra fallaba en el segundo. BigQuery tiene un tipo `JSON` nativo que toma el valor tal cual: eso recibe un array mezclado. Uno homogéneo sigue siendo una columna repetida de su tipo.
¿Por qué un campo es NULLABLE si mi primera fila siempre lo trae?
Porque otra fila no lo trae. El esquema es la unión de todos los objetos de la muestra, y un campo ausente en algunos no puede ser REQUIRED: la carga rechazaría esas filas. Leer solo el primer objeto daba un esquema que fallaba con el resto: «no such field».
¿Cómo uso el archivo?
`bq load --source_format=NEWLINE_DELIMITED_JSON --schema=schema.json mydataset.mytable data.ndjson`. El esquema vive en un archivo propio, junto a los datos y no dentro de ellos; por la API, el mismo array va bajo `schema.fields`.

Convertidores relacionados