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 contiene city y zip.

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 y name son campos simples.
  • addresses es un campo repetido que contiene una lista de estructuras (STRUCT).
  • Cada STRUCT en addresses tiene dos campos: city y zip.

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 array addresses 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

  1. Crea una tabla llamada productos con los siguientes campos:

    • product_id (INT64)
    • name (STRING)
    • categories (ARRAY)
    • specifications (STRUCT<weight FLOAT64, dimensions STRING>)
  2. 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"}
  1. 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 array categories 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

Módulo 2: SQL Básico en BigQuery

Módulo 3: SQL Intermedio en BigQuery

Módulo 4: SQL Avanzado en BigQuery

Módulo 5: Gestión de Datos en BigQuery

Módulo 6: Optimización del Rendimiento de BigQuery

Módulo 7: Seguridad y Cumplimiento en BigQuery

Módulo 8: Integración y Automatización de BigQuery

Módulo 9: Machine Learning en BigQuery (BQML)

Módulo 10: Casos de Uso de BigQuery en el Mundo Real

© Copyright 2024. Todos los derechos reservados