
Before you begin
- Labs create a Google Cloud project and resources for a fixed time
- Labs have a time limit and no pause feature. If you end the lab, you'll have to restart from the beginning.
- On the top left of your screen, click Start lab to begin
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
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.
En este lab, aprenderás a hacer lo siguiente:
Lee estas instrucciones. Los labs cuentan con un temporizador que no se puede pausar. El temporizador, 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:
Haz clic en el botón Comenzar lab. Si debes pagar por el lab, se abrirá un diálogo para que selecciones la forma de pago. A la izquierda, se encuentra el panel Detalles del lab, que tiene estos elementos:
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: Ordena las pestañas en ventanas separadas, una junto a la otra.
De ser necesario, copia el nombre de usuario a continuación y pégalo en el diálogo Acceder.
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.
También puedes encontrar la contraseña en el panel Detalles del lab.
Haz clic en Siguiente.
Haz clic para avanzar por las páginas siguientes:
Después de un momento, se abrirá la consola de Google Cloud en esta pestaña.
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.
Se abrirá la consola de BigQuery.
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.
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?
¿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:
Compruébalo.
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).
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.
¿Te preguntas cómo puedes transferir un archivo JSON a BigQuery?
Crea una nueva tabla fruit_details
en el conjunto de datos.
fruit_store
.Ahora verás la opción Crear tabla.
cloud-training/data-insights-course/labs/optimizing-for-performance/shopping_cart.json
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
Haz clic en Revisar mi progreso para verificar el objetivo.
Si aún no tienes arrays en tus tablas, puedes crearlos.
Ahora usa la función ARRAY_AGG()
para agregar los valores de nuestra cadena a un array.
ARRAY_LENGTH()
para contar la cantidad de páginas y productos que se visualizaron:DISTINCT
a ARRAY_AGG()
:Haz clic en Revisar mi progreso para verificar el objetivo.
Resumen
Puedes hacer cosas muy útiles con los arrays, como las siguientes:
ARRAY_LENGTH(<array>)
ARRAY_AGG(DISTINCT <field>)
ARRAY_AGG(<field> ORDER BY <field>)
ARRAY_AGG(<field> LIMIT 5)
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.
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.
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:
Haz clic en Revisar mi progreso para verificar el objetivo.
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:
Parece igual a una tabla, ¿verdad?
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:
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”.
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.
Fila |
runner.name |
runner.splits |
1 |
Rudisha |
23.4 |
26.3 | ||
26.4 | ||
26.1 |
En resumen:
Crea un nuevo conjunto de datos llamado racing
.
Haz clic en el conjunto de datos racing
y haz clic en Crear tabla.
cloud-training/data-insights-course/labs/optimizing-for-performance/race_results.json
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.
¿Cuántas filas muestra la consulta?
Respuesta: 1
¿Qué pasaría si quisieras mostrar el nombre de cada corredor y el tipo de carrera?
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.
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
.
¡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 |
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:
STRUCT(``"Rudisha" as name, [23.4, 26.3, 26.4, 26.1] as splits``)`` AS runner
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.
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.
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.
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.
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.
Solución posible:
Fila |
name |
split_time |
1 |
Kipketer |
23.2 |
Haz clic en Revisar mi progreso para verificar el objetivo.
Transferiste correctamente conjuntos de datos JSON, creaste ARRAYS y STRUCTS y desanidaste datos semiestructurados para obtener estadísticas.
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 2025 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.
Este contenido no está disponible en este momento
Te enviaremos una notificación por correo electrónico cuando esté disponible
¡Genial!
Nos comunicaremos contigo por correo electrónico si está disponible
One lab at a time
Confirm to end all existing labs and start this one