Puntos de control
Create a new dataset and table to store the data
/ 20
Execute the query to see how many unique products were viewed
/ 15
Execute the query to use the UNNEST() on array field
/ 15
Create a dataset and a table to ingest JSON data
/ 20
Execute the query to COUNT how many racers were there in total
/ 10
Execute the query that will list the total race time for racers whose names begin with R
/ 10
Execute the query to see which runner ran fastest lap time
/ 10
Cómo trabajar con JSON, arrays y structs en BigQuery
- GSP416
- Descripción general
- Configuración y requisitos
- Tarea 1. Crea un nuevo conjunto de datos para almacenar las tablas
- Tarea 2: Practica cómo trabajar con arrays en SQL
- Tarea 3: Crea tus propios arrays con ARRAY_AGG()
- Tarea 4: Consulta tablas que contengan arrays
- Tarea 5: Introducción a los STRUCTS
- Tarea 6: Practica con los STRUCTS y ARRAYS
- Tarea 7: Pregunta del lab: STRUCT()
- Tarea 8: Pregunta del lab: Cómo descomprimir arrays con UNNEST( )
- Tarea 9: Filtra dentro de los valores de array
- ¡Felicitaciones!
GSP416
Descripción general
BigQuery es la base de datos analítica de bajo costo, no-ops y completamente administrada de Google. Con BigQuery, puedes consultar muchos terabytes de datos sin tener que administrar infraestructuras y sin necesitar un administrador de base de datos. BigQuery usa SQL y puede aprovechar el modelo de pago por uso. BigQuery permite que te enfoques en el análisis de datos para encontrar estadísticas valiosas.
En este lab, trabajas en profundidad con datos semiestructurados (transferencia de archivos de tipo JSON y arrays) dentro de BigQuery. Desnormalizar tu esquema en una sola tabla con campos repetidos y anidados puede mejorar el rendimiento; no obstante, puede ser difícil usar la sintaxis de SQL para trabajar con arrays. Practicarás cómo cargar, consultar y desanidar diversos conjuntos de datos semiestructurados, además de cómo solucionar problemas en ellos.
Actividades
En este lab, aprenderás a hacer lo siguiente:
- Cargar, consultar y desanidar datos semiestructurados
- Solucionar problemas relacionados con consultas de datos semiestructurados
Configuración y requisitos
Antes de hacer clic en el botón Comenzar lab
Lee estas instrucciones. Los labs son cronometrados y no se pueden pausar. El cronómetro, que comienza a funcionar cuando haces clic en Comenzar lab, indica por cuánto tiempo tendrás a tu disposición los recursos de Google Cloud.
Este lab práctico te permitirá realizar las actividades correspondientes en un entorno de nube real, no en uno de simulación o demostración. Para ello, se te proporcionan credenciales temporales nuevas que utilizarás para acceder a Google Cloud durante todo el lab.
Para completar este lab, necesitarás lo siguiente:
- Acceso a un navegador de Internet estándar (se recomienda el navegador Chrome)
- Tiempo para completar el lab: Recuerda que, una vez que comienzas un lab, no puedes pausarlo.
Cómo iniciar tu lab y acceder a la consola de Google Cloud
-
Haga clic en el botón Comenzar lab. Si debe pagar por el lab, se abrirá una ventana emergente para que seleccione su forma de pago. A la izquierda, se encuentra el panel Detalles del lab, que tiene estos elementos:
- El botón Abrir la consola de Google Cloud
- El tiempo restante
- Las credenciales temporales que debe usar para el lab
- Otra información para completar el lab, si es necesaria
-
Haz clic en Abrir la consola de Google Cloud (o haz clic con el botón derecho y selecciona Abrir el vínculo en una ventana de incógnito si ejecutas el navegador Chrome).
El lab inicia recursos y abre otra pestaña en la que se muestra la página de acceso.
Sugerencia: Ordene las pestañas en ventanas separadas, una junto a la otra.
Nota: Si ves el diálogo Elegir una cuenta, haz clic en Usar otra cuenta. -
De ser necesario, copia el nombre de usuario a continuación y pégalo en el diálogo Acceder.
{{{user_0.username | "Username"}}} También puedes encontrar el nombre de usuario en el panel Detalles del lab.
-
Haz clic en Siguiente.
-
Copia la contraseña que aparece a continuación y pégala en el diálogo Te damos la bienvenida.
{{{user_0.password | "Password"}}} También puedes encontrar la contraseña en el panel Detalles del lab.
-
Haz clic en Siguiente.
Importante: Debes usar las credenciales que te proporciona el lab. No uses las credenciales de tu cuenta de Google Cloud. Nota: Usar tu propia Cuenta de Google podría generar cargos adicionales. -
Haga clic para avanzar por las páginas siguientes:
- Acepta los Términos y Condiciones.
- No agregues opciones de recuperación o autenticación de dos factores (esta es una cuenta temporal).
- No te registres para obtener pruebas gratuitas.
Después de un momento, se abrirá la consola de Google Cloud en esta pestaña.
Cómo abrir la consola de BigQuery
- En la consola de Google Cloud, seleccione elmenú de navegación > BigQuery.
Se abrirá el cuadro de mensaje Te damos la bienvenida a BigQuery en la consola de Cloud. Este cuadro de mensaje contiene un vínculo a la guía de inicio rápido y las notas de la versión.
- Haga clic en Listo.
Se abrirá la consola de BigQuery.
Tarea 1. Crea un nuevo conjunto de datos para almacenar las tablas
- En BigQuery, haz clic en los tres puntos que aparecen junto al ID del proyecto y selecciona Crear conjunto de datos:
-
Asígnale el nombre
fruit_store
al nuevo conjunto de datos. Deja las otras opciones con sus valores predeterminados (Ubicación de los datos y Vencimiento predeterminado). -
Haz clic en Crear conjunto de datos.
Tarea 2: Practica cómo trabajar con arrays en SQL
Normalmente, en SQL habrá un único valor para cada fila, como en esta lista de frutas:
Fila |
Fruit |
1 |
raspberry |
2 |
blackberry |
3 |
strawberry |
4 |
cherry |
¿Qué pasaría si quisieras tener una lista de frutas para cada persona que hay en la tienda? Tal vez se vería así:
Fila |
Fruit |
Person |
1 |
raspberry |
sally |
2 |
blackberry |
sally |
3 |
strawberry |
sally |
4 |
cherry |
sally |
5 |
orange |
frederick |
6 |
apple |
frederick |
En una base de datos SQL relacional tradicional, tomarías la decisión de dividir la tabla en dos tablas diferentes de inmediato (Fruit y Person) al ver los nombres que se repiten. Ese proceso se denomina normalización (pasar de una tabla a muchas) y es un enfoque frecuente para bases de datos transaccionales como MySQL.
Para el almacenamiento de datos, los analistas de datos suelen hacer lo opuesto (desnormalización) y unen muchas tablas distintas para crear una gran tabla de informes.
Ahora, aprenderás un enfoque diferente que utiliza campos repetidos para almacenar datos con distintos niveles de detalle en una sola tabla:
Fila |
Fruit (array) |
Person |
1 |
raspberry |
sally |
blackberry | ||
strawberry | ||
cherry | ||
2 |
orange |
frederick |
apple |
¿Qué tiene de extraño la tabla anterior?
- Solo tiene dos filas.
- Hay muchos valores de campo para Fruit en una sola fila.
- Las personas y todos los valores de campo están asociados.
¿Cuál es la estadística clave? El tipo de datos array
.
Esta es una forma más sencilla de interpretar el array Fruit:
Fila |
Fruit (array) |
Person |
1 |
[raspberry, blackberry, strawberry, cherry] |
sally |
2 |
[orange, apple] |
frederick |
Ambas tablas son exactamente iguales. De aquí surgen dos aprendizajes clave:
- Básicamente, un array es una lista de elementos entre corchetes [ ].
- BigQuery muestra los arrays visualmente como acoplados. Solo ordena los valores del array verticalmente (ten en cuenta que todos esos valores siguen perteneciendo a una sola fila).
Compruébalo.
- Ingresa lo siguiente en el editor de consultas de BigQuery:
-
Haz clic en Ejecutar.
-
Ahora prueba ejecutar esta:
Deberías ver un error parecido al siguiente:
Error: Array elements of types {INT64, STRING} do not have a common supertype at [3:1]
Los arrays solo pueden compartir un tipo de datos (todas las cadenas, todos los números).
- Esta es la tabla final para ejecutar la consulta:
-
Haz clic en Ejecutar.
-
Después de ver los resultados, haz clic en la pestaña JSON para visualizar la estructura anidada de los resultados.
Cómo cargar archivos JSON semiestructurados a BigQuery
¿Te preguntas cómo puedes transferir un archivo JSON a BigQuery?
Crea una nueva tabla fruit_details
en el conjunto de datos.
- Haz clic en el conjunto de datos
fruit_store
.
Ahora verás la opción Crear tabla.
- Agrega los siguientes detalles a la tabla:
- Fuente: Selecciona Google Cloud Storage en el menú desplegable Crear tabla desde
-
Selecciona un archivo del bucket de Cloud Storage:
cloud-training/data-insights-course/labs/optimizing-for-performance/shopping_cart.json
- Formato de archivo: JSONL (JSON delimitado por líneas nuevas)
-
Asigna el nombre
fruit_details
a la nueva tabla. -
Marca la casilla de verificación Esquema (Detección automática).
-
Haz clic en Crear tabla.
En el esquema, observa que fruit_array
está marcado como REPEATED, lo cual indica que es un array.
Resumen
- BigQuery admite arrays de forma nativa.
- Los valores de los arrays deben tener un mismo tipo de datos.
- Los arrays se llaman campos REPETIDOS en BigQuery.
Haz clic en Revisar mi progreso para verificar el objetivo.
Tarea 3: Crea tus propios arrays con ARRAY_AGG()
Si aún no tienes arrays en tus tablas, puedes crearlos.
- Copia y pega la siguiente consulta para explorar este conjunto de datos públicos:
- Haz clic en Ejecutar y visualiza los resultados.
Ahora usa la función ARRAY_AGG()
para agregar los valores de nuestra cadena a un array.
- Copia y pega la siguiente consulta para explorar este conjunto de datos públicos:
- Haz clic en Ejecutar y visualiza los resultados.
- A continuación, usa la función
ARRAY_LENGTH()
para contar la cantidad de páginas y productos que se visualizaron:
- Luego, anula el duplicado de las páginas y los productos para ver cuántos productos únicos se visualizaron. Para ello, agrega
DISTINCT
aARRAY_AGG()
:
Haz clic en Revisar mi progreso para verificar el objetivo.
Resumen
Puedes hacer cosas muy útiles con los arrays, como las siguientes:
- calcular la cantidad de elementos con
ARRAY_LENGTH(<array>)
- anular el duplicado de elementos con
ARRAY_AGG(DISTINCT <field>)
- ordenar elementos con
ARRAY_AGG(<field> ORDER BY <field>)
- limitar
ARRAY_AGG(<field> LIMIT 5)
Tarea 4: Consulta tablas que contengan arrays
El conjunto de datos públicos de BigQuery para Google Analytics, bigquery-public-data.google_analytics_sample
, tiene muchos más campos y filas que el conjunto de datos de nuestro curso, data-to-insights.ecommerce.all_sessions
. Lo más importante es que ya almacena valores de campo, como productos, páginas y transacciones, de forma nativa como ARRAYS.
- Copia y pega la siguiente consulta para explorar los datos disponibles y comprobar si puedes encontrar campos con valores repetidos (arrays):
-
Ejecuta la consulta.
-
Desplázate hacia la derecha sobre los resultados hasta que veas el campo
hits.product.v2ProductName
(en breve hablaremos sobre los distintos alias de campo).
Puede resultar abrumador analizar todos los campos disponibles en el esquema de Google Analytics.
- Intenta consultar solo los campos de nombre de las visitas y las páginas como hiciste anteriormente:
Verás el siguiente error:
Error:Cannot access field page on a value with type ARRAY<STRUCT<hitNumber INT64, time INT64, hour INT64, ...>> at [3:8]
Para consultar campos REPETIDOS (arrays) normalmente, primero deberás volver a dividir los arrays en filas.
Por ejemplo, el array de hits.page.pageTitle
está almacenado como una sola fila, de la siguiente manera:
Sin embargo, tiene que verse así:
¿Cómo lo hacemos con SQL?
Respuesta: Utiliza la función UNNEST() en el campo de array:
Hablaremos sobre UNNEST() más adelante en detalle, pero, por ahora, debes saber lo siguiente:
- Tienes que utilizar UNNEST() para desanidar los arrays y volver a organizar sus elementos en filas.
- UNNEST() siempre aparece después del nombre de la tabla en tu cláusula FROM (piénsalo como una tabla previamente unida).
Haz clic en Revisar mi progreso para verificar el objetivo.
Tarea 5: Introducción a los STRUCTS
Quizás te hayas preguntado por qué el alias de campo hit.page.pageTitle
se ve como tres campos en uno, separados con puntos. Del mismo modo que los valores de los ARRAYS te otorgan flexibilidad para analizar en más profundidad el nivel de detalle de tus campos, otros tipos de datos te permiten ampliar el esquema agrupando campos relacionados. Ese tipo de datos SQL es el tipo de datos STRUCT.
La manera más fácil de pensar en un STRUCT es considerarlo una tabla separada que se unió previamente a tu tabla principal.
Un STRUCT puede tener lo siguiente:
- Uno o muchos campos
- Los mismos tipos de datos o tipos distintos de datos para cada campo
- Su propio alias
Parece igual a una tabla, ¿verdad?
Explora un conjunto de datos con STRUCT
-
Para abrir el conjunto de datos bigquery-public-data, haz clic en +AGREGAR, selecciona Destaca un proyecto por nombre y, luego, ingresa el nombre
bigquery-public-data
-
Haz clic en Destacar.
El proyecto bigquery-public-data
aparecerá en la sección Explorador.
-
Abre bigquery-public-data.
-
Busca y abre el conjunto de datos google_analytics_sample.
-
Haz clic en la tabla ga_sessions(366)_.
-
Comienza a desplazarte por el esquema y responde la siguiente pregunta usando la función de búsqueda en tu navegador.
Como puedes imaginar, hay una cantidad enorme de datos de sesión del sitio web almacenados para un sitio web moderno de comercio electrónico.
La ventaja principal de tener 32 STRUCTS en una sola tabla es que te permite ejecutar consultas como esta sin tener que realizar UNIONES:
.*
le indica a BigQuery que devuelva todos los campos para ese STRUCT (de la misma manera que lo haría si totals.*
fuera una tabla independiente que unimos).Almacenar tus tablas grandes de informes como STRUCTS (“tablas” previamente unidas) y ARRAYS (gran nivel de detalle) te permite hacer lo siguiente:
- Evitar 32 UNIONES de tabla para obtener ventajas significativas en cuanto al rendimiento
- Obtener datos detallados a partir de los ARRAYS cuando lo necesites, sin que haya consecuencias si no lo haces (BigQuery almacena cada columna de forma individual en el disco)
- Tener todo el contexto comercial en una tabla, en lugar de preocuparte por las claves de UNIÓN y por recordar qué tablas tienen los datos que necesitas
Tarea 6: Practica con los STRUCTS y ARRAYS
El próximo conjunto de datos incluirá los tiempos de corredores en sus vueltas alrededor de una pista. A cada vuelta la llamaremos “fracción”.
- Para esta consulta, prueba la sintaxis de STRUCT y observa los distintos tipos de campos dentro del contenedor de struct:
Fila |
runner.name |
runner.split |
1 |
Rudisha |
23.4 |
¿Qué puedes observar sobre los alias de campo? Puesto que el struct contiene campos anidados (los nombres y las fracciones son un subconjunto del corredor), se obtiene una notación de puntos.
¿Qué sucede si el corredor tiene varias fracciones de tiempo para una sola carrera (como el tiempo por vuelta)?
Usaremos un array, por supuesto.
- Ejecuta la siguiente consulta para confirmar esto:
Fila |
runner.name |
runner.splits |
1 |
Rudisha |
23.4 |
26.3 | ||
26.4 | ||
26.1 |
En resumen:
- Los structs son contenedores que pueden tener varios tipos de datos y nombres de campos anidados.
- Los arrays pueden ser uno de los tipos de campos dentro de un struct (como se mostró antes con el campo “fracciones”).
Practica transferir los datos de JSON
-
Crea un nuevo conjunto de datos llamado
racing
. -
Haz clic en el conjunto de datos
racing
y haz clic en Crear tabla.
- Fuente: Selecciona Google Cloud Storage en el menú desplegable Crear tabla desde
-
Selecciona un archivo del bucket de Cloud Storage:
cloud-training/data-insights-course/labs/optimizing-for-performance/race_results.json
- Formato de archivo: JSONL (JSON delimitado por líneas nuevas)
- En Esquema, haz clic en el control deslizante Editar como texto y agrega lo siguiente:
-
Asígnale el nombre
race_results
a la nueva tabla. -
Haz clic en Crear tabla.
-
Una vez que se complete el trabajo de carga, obtén una vista previa del esquema de la tabla creada recientemente:
¿Cuál es el campo STRUCT?, ¿cómo lo sabes?
El campo participants es el STRUCT porque es del tipo RECORD.
¿Qué campo es el ARRAY?
El campo participants.splits
es un array de floats dentro del struct principal participants
. Tiene un modo REPEATED, lo que indica que es un array. Los valores de este array se llaman valores anidados porque hay varios valores dentro de un solo campo.
Haz clic en Revisar mi progreso para verificar el objetivo.
Practica cómo consultar campos repetidos y anidados
- Veamos los tiempos de los corredores para la carrera de 800 metros:
¿Cuántas filas muestra la consulta?
Respuesta: 1
¿Qué pasaría si quisieras mostrar el nombre de cada corredor y el tipo de carrera?
- Ejecuta el siguiente esquema y ve qué sucede:
Error: Cannot access field name on a value with type ARRAY<STRUCT<name STRING, splits ARRAY<FLOAT64>>>> at [2:27]
Tal como sucede cuando olvidas la instrucción GROUP BY al usar funciones de suma, aquí tenemos dos niveles de detalle diferentes: una fila para la carrera y tres filas para los nombres de los participantes. ¿Qué puedes hacer para cambiar esto…
Fila |
race |
participants.name |
1 |
800 m |
Rudisha |
2 |
??? |
Makhloufi |
3 |
??? |
Murphy |
…por esto?
Fila |
race |
participants.name |
1 |
800 m |
Rudisha |
2 |
800 m |
Makhloufi |
3 |
800 m |
Murphy |
En SQL relacional tradicional, si tuvieras una tabla de carreras y una de participantes, ¿qué harías para obtener información de ambas tablas? Las UNIRÍAS. El STRUCT de participantes (que es conceptualmente muy similar a una tabla) ya es parte de tu tabla de carreras, pero aún no se correlaciona correctamente con tu campo “race” que no pertenece al STRUCT.
¿Qué comando SQL de dos palabras usarías para correlacionar la carrera de 800 m con cada corredor de la primera tabla?
Respuesta: UNIÓN CRUZADA
Perfecto.
- Ahora intenta ejecutar lo siguiente:
Table name "participants" missing dataset while no default dataset is set in the request
.
Si bien el struct de participantes es como una tabla, técnicamente sigue siendo un campo de la tabla racing.race_results
.
- Agrega el nombre del conjunto de datos a la consulta:
- Y haz clic en Ejecutar.
¡Bien! Mostraste correctamente la lista de todos los corredores de cada carrera.
Fila |
race |
name |
1 |
800 m |
Rudisha |
2 |
800 m |
Makhloufi |
3 |
800 m |
Murphy |
4 |
800 m |
Bosse |
5 |
800 m |
Rotich |
6 |
800 m |
Lewandowski |
7 |
800 m |
Kipketer |
8 |
800 m |
Berian |
- Para simplificar la última consulta, puedes hacer lo siguiente:
- Agregar un alias para la tabla original
- Reemplazar las palabras "CROSS JOIN" por una coma, ya que, implícitamente, realiza la unión cruzada
El resultado de la consulta será el mismo:
Si tienes más de un tipo de carrera (800 m, 100 m, 200 m), ¿una UNIÓN CRUZADA no asociaría el nombre de cada corredor con todas las carreras posibles como un producto cartesiano?
Respuesta: No. Esta es una unión cruzada correlacionada que solo descomprime los elementos asociados con una sola fila. Para obtener un análisis más detallado del tema, consulta cómo trabajar con ARRAYS y STRUCTS
Resumen de los STRUCTS:
- Un STRUCT de SQL es básicamente un contenedor de otros campos de datos que pueden ser de distintos tipos. La palabra “struct” significa “estructura de datos”. Recuerda el ejemplo de antes:
STRUCT(``"Rudisha" as name, [23.4, 26.3, 26.4, 26.1] as splits``)`` AS runner
- A los STRUCTS se les da un alias (como “runner” en el ejemplo anterior) y podemos entenderlos como una tabla dentro de una tabla principal.
- Es necesario descomprimir los STRUCTS (y los ARRAYS) para poder usar sus elementos. Incluye UNNEST() junto al nombre del struct o del campo del struct que es un array para descomprimirlo y compactarlo.
Tarea 7: Pregunta del lab: STRUCT()
Usa la tabla racing.race_results
que creaste anteriormente para responder la siguiente pregunta.
Tarea: Escribe una consulta para CONTAR cuántos corredores había en total.
- Para comenzar, usa la siguiente consulta escrita parcialmente:
FROM
.Solución posible:
Fila |
racer_count |
1 |
8 |
Respuesta: 8 corredores participaron en la carrera.
Haz clic en Revisar mi progreso para verificar el objetivo.
Tarea 8: Pregunta del lab: Cómo descomprimir arrays con UNNEST( )
Escribe una consulta que muestre una lista del tiempo total de carrera correspondiente a los corredores cuyos nombres comiencen con R. Ordena los resultados de modo que el mejor tiempo total aparezca primero. Usa el operador UNNEST() y comienza con la consulta escrita parcialmente que figura a continuación.
- Completa la consulta:
- Deberás descomprimir el struct y el array dentro del struct como fuentes de datos después de la cláusula FROM.
- Asegúrate de usar alias cuando corresponda.
Solución posible:
Fila |
name |
total_race_time |
1 |
Rudisha |
102.19999999999999 |
2 |
Rotich |
103.6 |
Haz clic en Revisar mi progreso para verificar el objetivo.
Tarea 9: Filtra dentro de los valores de array
Descubriste que el tiempo por vuelta más rápido registrado para la carrera de 800 m fue 23.2 segundos, pero no viste qué corredor dio esa vuelta en particular. Crea una consulta que devuelva ese resultado.
- Completa la consulta escrita parcialmente:
Solución posible:
Fila |
name |
split_time |
1 |
Kipketer |
23.2 |
Haz clic en Revisar mi progreso para verificar el objetivo.
¡Felicitaciones!
Transferiste correctamente conjuntos de datos JSON, creaste ARRAYS y STRUCTS y desanidaste datos semiestructurados para obtener estadísticas.
Próximos pasos y más información
- Si necesitas una lectura adicional, te sugerimos el artículo Cómo trabajar con arrays.
- Consulta los siguientes labs:
Capacitación y certificación de Google Cloud
Recibe la formación que necesitas para aprovechar al máximo las tecnologías de Google Cloud. Nuestras clases incluyen habilidades técnicas y recomendaciones para ayudarte a avanzar rápidamente y a seguir aprendiendo. Para que puedas realizar nuestros cursos cuando más te convenga, ofrecemos distintos tipos de capacitación de nivel básico a avanzado: a pedido, presenciales y virtuales. Las certificaciones te ayudan a validar y demostrar tus habilidades y tu conocimiento técnico respecto a las tecnologías de Google Cloud.
Última actualización del manual: 3 de febrero de 2024
Prueba más reciente del lab: 25 de agosto de 2023
Copyright 2024 Google LLC. All rights reserved. Google y el logotipo de Google son marcas de Google LLC. Los demás nombres de productos y empresas pueden ser marcas de las respectivas empresas a las que estén asociados.