BigQuery tiene un mejor rendimiento cuando tus datos están desnormalizados. En vez de conservar un esquema relacional como un esquema estrella o copo de nieve, desnormaliza tus datos y aprovecha las columnas anidadas o repetidas. Estas columnas anidadas o repetidas pueden mantener relaciones sin el impacto en el rendimiento que genera preservar un esquema relacional (normalizado).
Puedes especificar datos anidados o datos anidados y repetidos en Cloud Console o en un archivo de esquema JSON. Para especificar columnas anidadas o repetidas y anidadas, debes usar el tipo de datos RECORD
(STRUCT
).
Especifica columnas anidadas y repetidas
BigQuery admite la carga de datos anidados y repetidos desde formatos fuente compatibles con esquemas basados en objetos, como archivos JSON y Avro, y archivos de exportación de Firestore y Datastore.
Por ejemplo, es probable que una base de datos relacional usada para rastrear los libros de la biblioteca mantenga toda la información del autor en una tabla separada. Una clave como author_id
se usaría para vincular el libro con los autores.
En BigQuery, puedes preservar la relación entre el libro y el autor sin crear una tabla de autor separada. En su lugar, creas una columna de autor y anidas campos dentro de ella, como el nombre, el apellido, la fecha de nacimiento del autor, etcétera. Si un libro tiene varios autores, puedes hacer que la columna de autor anidada se repita.
Para crear una columna con datos anidados y repetidos, establece el tipo de datos de la columna como RECORD
. Un RECORD
se almacena como STRUCT
y se puede acceder a él como STRUCT
en SQL estándar. Un STRUCT
es un contenedor de campos ordenados, cada uno con un tipo (obligatorio) y un nombre (opcional). Para anidar la columna, agrega campos secundarios al RECORD
(superior). Para repetir la columna, cambia el modo a REPEATED
.
Limitaciones
Los esquemas anidados y repetidos están sujetos a las siguientes limitaciones:
- Cuando cargas datos anidados y repetidos, tu esquema no puede contener más de 15 niveles de
STRUCT
anidados (tiposRECORD
). - BigQuery admite columnas del tipo
STRUCT
(oRECORD
). UnSTRUCT
es un tipo complejo que puede usarse para representar un objeto que tiene varias columnas secundarias. En una columnaSTRUCT
también puedes definir una o más de las columnas secundarias como tipoSTRUCT
(denominadasSTRUCT
anidados o incorporados). Cuando anidasSTRUCTS
, BigQuery aplica un límite de profundidad de anidado de 15 niveles. El límite de profundidad de anidado es independiente de si losSTRUCT
son escalares o basados en arreglos.
Ejemplo
Esquema de ejemplo
El siguiente ejemplo presenta datos anidados y repetidos de muestra. Esta tabla contiene información sobre las personas. Consta de los siguientes campos:
id
first_name
last_name
dob
(fecha de nacimiento)addresses
(un campo repetido y anidado)addresses.status
(actual o anterior)addresses.address
addresses.city
addresses.state
addresses.zip
addresses.numberOfYears
(años en la dirección)
El archivo de datos JSON debería ser similar a lo que se muestra a continuación. Observa que la columna de direcciones contiene un arreglo de valores (indicado por [ ]
). Las múltiples direcciones en el arreglo son los datos repetidos. Los múltiples campos dentro de cada dirección son los datos anidados.
{"id":"1","first_name":"John","last_name":"Doe","dob":"1968-01-22","addresses":[{"status":"current","address":"123 First Avenue","city":"Seattle","state":"WA","zip":"11111","numberOfYears":"1"},{"status":"previous","address":"456 Main Street","city":"Portland","state":"OR","zip":"22222","numberOfYears":"5"}]} {"id":"2","first_name":"Jane","last_name":"Doe","dob":"1980-10-16","addresses":[{"status":"current","address":"789 Any Avenue","city":"New York","state":"NY","zip":"33333","numberOfYears":"2"},{"status":"previous","address":"321 Main Street","city":"Hoboken","state":"NJ","zip":"44444","numberOfYears":"3"}]}
El esquema para esta tabla se vería como el siguiente:
[ { "name": "id", "type": "STRING", "mode": "NULLABLE" }, { "name": "first_name", "type": "STRING", "mode": "NULLABLE" }, { "name": "last_name", "type": "STRING", "mode": "NULLABLE" }, { "name": "dob", "type": "DATE", "mode": "NULLABLE" }, { "name": "addresses", "type": "RECORD", "mode": "REPEATED", "fields": [ { "name": "status", "type": "STRING", "mode": "NULLABLE" }, { "name": "address", "type": "STRING", "mode": "NULLABLE" }, { "name": "city", "type": "STRING", "mode": "NULLABLE" }, { "name": "state", "type": "STRING", "mode": "NULLABLE" }, { "name": "zip", "type": "STRING", "mode": "NULLABLE" }, { "name": "numberOfYears", "type": "STRING", "mode": "NULLABLE" } ] } ]
Especifica las columnas anidadas y repetidas en el ejemplo
Console
Para especificar la columna anidada y repetida addresses
en Cloud Console, haz lo siguiente:
Abre la página de BigQuery en Cloud Console.
En el panel Explorador, expande tu proyecto y selecciona un conjunto de datos.
En el panel de detalles, haz clic en Crear tabla (Create table).
En la página Crear tabla:
- En Fuente, selecciona Tabla vacía.
- En Destino, elige el conjunto de datos y, luego, ingresa el nombre de la tabla en el campo Nombre de la tabla.
En Schema (Esquema), agrega un campo:
- En el campo Name (Nombre), escribe
addresses
. - En Tipo, selecciona
RECORD
. En Modo, selecciona
REPEATED
.A la derecha de
addresses
, haz clic en el ícono de signo más para agregar un campo anidado.- En el campo Name (Nombre), escribe
status
. Observa que el campo ya está propagado conaddresses.
, lo que indica que es un campo anidado. - En Tipo, selecciona
STRING
. En Modo, deja el valor configurado como
NULLABLE
.Repite estos pasos para agregar
address
(STRING
NULLABLE
),city
(STRING
NULLABLE
),state
(STRING
NULLABLE
),zip
(STRING
NULLABLE
) ynumberOfYears
(STRING
NULLABLE
).
- En el campo Name (Nombre), escribe
- En el campo Name (Nombre), escribe
Como alternativa, haz clic en Editar como texto (Edit as text) y especifica el esquema como un arreglo JSON.
bq
Para especificar la columna anidada y repetida addresses
en un archivo de esquema JSON, ingresa lo siguiente mediante un editor de texto:
[ { "name": "id", "type": "STRING", "mode": "NULLABLE" }, { "name": "first_name", "type": "STRING", "mode": "NULLABLE" }, { "name": "last_name", "type": "STRING", "mode": "NULLABLE" }, { "name": "dob", "type": "DATE", "mode": "NULLABLE" }, { "name": "addresses", "type": "RECORD", "mode": "REPEATED", "fields": [ { "name": "status", "type": "STRING", "mode": "NULLABLE" }, { "name": "address", "type": "STRING", "mode": "NULLABLE" }, { "name": "city", "type": "STRING", "mode": "NULLABLE" }, { "name": "state", "type": "STRING", "mode": "NULLABLE" }, { "name": "zip", "type": "STRING", "mode": "NULLABLE" }, { "name": "numberOfYears", "type": "STRING", "mode": "NULLABLE" } ] } ]
Después de crear tu archivo de esquema JSON, puedes suministrarlo a través de la línea de comandos.
Go
Antes de probar este ejemplo, sigue las instrucciones de configuración para Go que se encuentran en la guía de inicio rápido de BigQuery sobre cómo usar bibliotecas cliente. Si deseas obtener más información, consulta la documentación de referencia de la API de Go de BigQuery.
Java
Antes de probar este ejemplo, sigue las instrucciones de configuración para Java que se encuentran en la guía de inicio rápido de BigQuery sobre cómo usar bibliotecas cliente. Para obtener más información, consulta la documentación de referencia de la API de BigQuery para Java.
Node.js
Antes de probar este ejemplo, sigue las instrucciones de configuración para Node.js que se encuentran en la guía de inicio rápido de BigQuery sobre cómo usar bibliotecas cliente. Para obtener más información, consulta la Documentación de referencia de la API de Node.js de BigQuery.
Python
Antes de probar esta muestra, sigue las instrucciones de configuración para Python incluidas en la Guía de inicio rápido de BigQuery sobre cómo usar bibliotecas cliente. Si deseas obtener más información, consulta la documentación de referencia de la API de Python de BigQuery.
Modifica columnas anidadas y repetidas
Después de que agregas una columna anidada o una columna anidada y repetida a la definición del esquema de una tabla, puedes modificar la columna como lo harías con cualquier otro tipo de columna. BigQuery admite de manera nativa varios cambios de esquema, como agregar un nuevo campo anidado a un registro o relajar el modo de un campo anidado. Para obtener más información, consulta Modifica esquemas de tablas.
Además, puedes modificar de manera manual una definición de esquema que incluya columnas anidadas y repetidas. Para obtener más información, consulta Cambia esquemas de tablas de forma manual.