Introducción
En BigQuery, los campos anidados y repetidos permiten almacenar datos jerárquicos y estructurados de manera eficiente. Estos tipos de campos son especialmente útiles cuando se trabaja con datos JSON o cuando se necesita representar relaciones complejas dentro de una sola tabla.
Objetivos de esta lección:
- Comprender qué son los campos anidados y repetidos.
- Aprender a crear y consultar tablas con campos anidados y repetidos.
- Conocer las ventajas y desventajas de usar estos tipos de campos.
¿Qué son los Campos Anidados y Repetidos?
Campos Anidados
Un campo anidado es un campo que contiene una estructura de datos compleja, como un objeto o un registro. En SQL estándar, esto se asemeja a tener una columna que contiene un JSON o un objeto.
Campos Repetidos
Un campo repetido es un campo que puede contener múltiples valores del mismo tipo, similar a un array en otros lenguajes de programación.
Ejemplo de Estructura de Datos
Considera una tabla de usuarios
que tiene la siguiente estructura:
user_id | name | addresses |
---|---|---|
1 | Alice | [{"city": "New York", "zip": "10001"}, {"city": "Boston", "zip": "02101"}] |
2 | Bob | [{"city": "San Francisco", "zip": "94101"}] |
En este ejemplo:
addresses
es un campo repetido que contiene una lista de objetos.- Cada objeto en
addresses
es un campo anidado que contienecity
yzip
.
Creación de Tablas con Campos Anidados y Repetidos
Definición de Esquema
Para crear una tabla con campos anidados y repetidos, primero debes definir el esquema de la tabla. Aquí hay un ejemplo de cómo hacerlo en BigQuery:
CREATE TABLE my_dataset.usuarios ( user_id INT64, name STRING, addresses ARRAY<STRUCT< city STRING, zip STRING >> );
Explicación del Código
user_id
yname
son campos simples.addresses
es un campo repetido que contiene una lista de estructuras (STRUCT
).- Cada
STRUCT
enaddresses
tiene dos campos:city
yzip
.
Consultas con Campos Anidados y Repetidos
Selección de Datos
Para seleccionar datos de una tabla con campos anidados y repetidos, puedes usar la función UNNEST
para descomponer los arrays.
SELECT user_id, name, address.city, address.zip FROM my_dataset.usuarios, UNNEST(addresses) AS address;
Explicación del Código
UNNEST(addresses)
descompone el arrayaddresses
en filas individuales.AS address
asigna un alias a cada elemento del array.
Ejemplo Práctico
Supongamos que tienes la siguiente tabla usuarios
:
user_id | name | addresses |
---|---|---|
1 | Alice | [{"city": "New York", "zip": "10001"}, {"city": "Boston", "zip": "02101"}] |
2 | Bob | [{"city": "San Francisco", "zip": "94101"}] |
La consulta anterior devolverá:
user_id | name | city | zip |
---|---|---|---|
1 | Alice | New York | 10001 |
1 | Alice | Boston | 02101 |
2 | Bob | San Francisco | 94101 |
Ventajas y Desventajas
Ventajas
- Eficiencia de Almacenamiento: Los datos jerárquicos se almacenan de manera más eficiente.
- Consultas Simplificadas: Menos necesidad de realizar múltiples
JOIN
para obtener datos relacionados.
Desventajas
- Complejidad de Consultas: Las consultas pueden volverse más complejas debido al uso de
UNNEST
. - Limitaciones de Compatibilidad: No todos los sistemas de bases de datos soportan campos anidados y repetidos de la misma manera.
Ejercicio Práctico
Ejercicio
-
Crea una tabla llamada
productos
con los siguientes campos:product_id
(INT64)name
(STRING)categories
(ARRAY) specifications
(STRUCT<weight FLOAT64, dimensions STRING>)
-
Inserta los siguientes datos en la tabla
productos
:
product_id | name | categories | specifications |
---|---|---|---|
1 | Laptop | ["Electronics", "Computers"] | {"weight": 2.5, "dimensions": "15x10x1"} |
2 | Smartphone | ["Electronics", "Mobile"] | {"weight": 0.2, "dimensions": "6x3x0.3"} |
- Escribe una consulta para seleccionar todos los productos y sus categorías.
Solución
-- Crear la tabla CREATE TABLE my_dataset.productos ( product_id INT64, name STRING, categories ARRAY<STRING>, specifications STRUCT< weight FLOAT64, dimensions STRING > ); -- Insertar datos INSERT INTO my_dataset.productos (product_id, name, categories, specifications) VALUES (1, 'Laptop', ['Electronics', 'Computers'], STRUCT(2.5 AS weight, '15x10x1' AS dimensions)), (2, 'Smartphone', ['Electronics', 'Mobile'], STRUCT(0.2 AS weight, '6x3x0.3' AS dimensions)); -- Consulta para seleccionar productos y categorías SELECT product_id, name, category FROM my_dataset.productos, UNNEST(categories) AS category;
Explicación de la Solución
- La tabla
productos
se crea con los campos especificados. - Los datos se insertan en la tabla.
- La consulta usa
UNNEST(categories)
para descomponer el arraycategories
en filas individuales.
Conclusión
En esta lección, hemos aprendido sobre los campos anidados y repetidos en BigQuery, cómo crearlos y consultarlos, y las ventajas y desventajas de su uso. Estos tipos de campos son poderosos para manejar datos jerárquicos y estructurados, pero requieren una comprensión clara de cómo descomponer y consultar estos datos de manera efectiva.
Próximos Pasos
En la siguiente lección, exploraremos las Funciones Definidas por el Usuario (UDFs) en BigQuery, que te permitirán extender las capacidades de SQL con tu propio código personalizado.
Curso de BigQuery
Módulo 1: Introducción a BigQuery
- ¿Qué es BigQuery?
- Configuración de tu Entorno de BigQuery
- Entendiendo la Arquitectura de BigQuery
- Visión General de la Consola de BigQuery
Módulo 2: SQL Básico en BigQuery
Módulo 3: SQL Intermedio en BigQuery
Módulo 4: SQL Avanzado en BigQuery
- Joins Avanzados
- Campos Anidados y Repetidos
- Funciones Definidas por el Usuario (UDFs)
- Particionamiento y Agrupamiento
Módulo 5: Gestión de Datos en BigQuery
- Cargando Datos en BigQuery
- Exportando Datos desde BigQuery
- Transformación y Limpieza de Datos
- Gestión de Conjuntos de Datos y Tablas
Módulo 6: Optimización del Rendimiento de BigQuery
- Técnicas de Optimización de Consultas
- Entendiendo los Planes de Ejecución de Consultas
- Uso de Vistas Materializadas
- Optimización del Almacenamiento
Módulo 7: Seguridad y Cumplimiento en BigQuery
- Control de Acceso y Permisos
- Encriptación de Datos
- Auditoría y Monitoreo
- Cumplimiento y Mejores Prácticas
Módulo 8: Integración y Automatización de BigQuery
- Integración con Servicios de Google Cloud
- Uso de BigQuery con Dataflow
- Automatización de Flujos de Trabajo con Cloud Functions
- Programación de Consultas con Cloud Scheduler
Módulo 9: Machine Learning en BigQuery (BQML)
- Introducción a BigQuery ML
- Creación y Entrenamiento de Modelos
- Evaluación y Predicción con Modelos
- Características Avanzadas de BQML