
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 est la base de données d'analyse NoOps, économique et entièrement gérée de Google. Avec BigQuery, vous pouvez interroger plusieurs téraoctets de données sans avoir à gérer d'infrastructure ni faire appel à un administrateur de base de données. Basé sur le langage SQL et le modèle de paiement à l'usage, BigQuery vous permet de vous concentrer sur l'analyse des données pour en dégager des informations pertinentes.
Dans cet atelier, vous allez travailler avec des données semi-structurées (ingestion JSON, types de données tableau) au sein de BigQuery. Dénormaliser votre schéma en une table unique avec des champs imbriqués et répétés permet d'améliorer les performances, mais l'utilisation de la syntaxe SQL avec les données de tableau (array) peut être délicate. Vous allez vous entraîner à charger, interroger, corriger et désimbriquer divers ensembles de données semi-structurées.
Dans cet atelier, vous allez apprendre à effectuer les tâches suivantes :
Lisez ces instructions. Les ateliers sont minutés, et vous ne pouvez pas les mettre en pause. Le minuteur, qui démarre lorsque vous cliquez sur Démarrer l'atelier, indique combien de temps les ressources Google Cloud resteront accessibles.
Cet atelier pratique vous permet de suivre les activités dans un véritable environnement cloud, et non dans un environnement de simulation ou de démonstration. Des identifiants temporaires vous sont fournis pour vous permettre de vous connecter à Google Cloud le temps de l'atelier.
Pour réaliser cet atelier :
Cliquez sur le bouton Démarrer l'atelier. Si l'atelier est payant, une boîte de dialogue s'affiche pour vous permettre de sélectionner un mode de paiement. Sur la gauche, vous trouverez le panneau "Détails concernant l'atelier", qui contient les éléments suivants :
Cliquez sur Ouvrir la console Google Cloud (ou effectuez un clic droit et sélectionnez Ouvrir le lien dans la fenêtre de navigation privée si vous utilisez le navigateur Chrome).
L'atelier lance les ressources, puis ouvre la page "Se connecter" dans un nouvel onglet.
Conseil : Réorganisez les onglets dans des fenêtres distinctes, placées côte à côte.
Si nécessaire, copiez le nom d'utilisateur ci-dessous et collez-le dans la boîte de dialogue Se connecter.
Vous trouverez également le nom d'utilisateur dans le panneau "Détails concernant l'atelier".
Cliquez sur Suivant.
Copiez le mot de passe ci-dessous et collez-le dans la boîte de dialogue Bienvenue.
Vous trouverez également le mot de passe dans le panneau "Détails concernant l'atelier".
Cliquez sur Suivant.
Accédez aux pages suivantes :
Après quelques instants, la console Cloud s'ouvre dans cet onglet.
Le message Bienvenue sur BigQuery dans Cloud Console s'affiche. Il contient un lien vers le guide de démarrage rapide et les notes de version.
La console BigQuery s'ouvre.
Nommez le nouvel ensemble de données fruit_store
. Conservez les valeurs par défaut des autres options, à savoir Emplacement des données et Expiration du tableau par défaut.
Cliquez sur Créer un ensemble de données.
Normalement, en langage SQL, chaque ligne est associée à une seule valeur, comme dans la liste de fruits ci-dessous :
Ligne |
Fruit |
1 |
raspberry |
2 |
blackberry |
3 |
strawberry |
4 |
cherry |
Comment procéder si vous voulez une liste de fruits pour chaque personne dans le magasin ? La liste pourrait alors se présenter comme suit :
Ligne |
Fruit |
Personne |
1 |
raspberry |
sally |
2 |
blackberry |
sally |
3 |
strawberry |
sally |
4 |
cherry |
sally |
5 |
orange |
frederick |
6 |
apple |
frederick |
Dans une base de données relationnelle SQL traditionnelle, vous constateriez que les noms sont répétés et penseriez immédiatement à diviser la table ci-dessus en deux tables distinctes : Fruits et Personnes. Ce processus s'appelle la normalisation (passer d'une table à plusieurs). Il s'agit d'une approche courante pour les bases de données transactionnelles telles que mySQL.
Pour l'entreposage de données, les analystes optent souvent pour la méthode inverse (dénormalisation), qui consiste à regrouper plusieurs tables distinctes dans une grande table de rapport.
Vous allez aujourd'hui découvrir une approche différente consistant à stocker les données avec différents niveaux de précision dans une seule et même table, à l'aide de champs répétés :
Ligne |
Fruit (objet array) |
Personne |
1 |
raspberry |
sally |
blackberry | ||
strawberry | ||
cherry | ||
2 |
orange |
frederick |
apple |
Qu'est-ce qui vous paraît bizarre dans la table ci-dessus ?
Quel est le principal élément à noter ? Le type de données array
!
Il existe une méthode plus simple pour interpréter l'objet array Fruit :
Ligne |
Fruit (objet array) |
Personne |
1 |
[raspberry, blackberry, strawberry, cherry] |
sally |
2 |
[orange, apple] |
frederick |
Ces deux tables sont identiques. Deux points importants sont à retenir ici :
À votre tour !
Cliquez sur Exécuter.
Essayez maintenant d'exécuter cette requête :
Vous allez normalement recevoir un message d'erreur ressemblant à celui-ci :
Error: Array elements of types {INT64, STRING} do not have a common supertype at [3:1]
Les objets array ne peuvent contenir qu'un seul type de données (seulement des chaînes ou seulement des nombres).
Cliquez sur Exécuter.
Après avoir observé les résultats, cliquez sur l'onglet JSON pour afficher la structure imbriquée des résultats.
Comment procéderiez-vous si vous deviez ingérer un fichier JSON dans BigQuery ?
Créez une nouvelle table fruit_details
dans l'ensemble de données.
fruit_store
.L'option Créer une table s'affiche.
cloud-training/data-insights-course/labs/optimizing-for-performance/shopping_cart.json
.Nommez la nouvelle table fruit_details
.
Cochez la case Détection automatique sous "Schéma".
Cliquez sur Créer une table.
Dans le schéma, notez que fruit_array
est marqué comme REPEATED (RÉPÉTÉ), ce qui signifie qu'il s'agit d'un tableau.
Résumé
Cliquez sur Vérifier ma progression pour valider l'objectif.
Si vous n'avez pas encore de tableaux dans vos tables, vous pouvez en créer.
Vous allez maintenant agréger les valeurs de chaîne dans un tableau avec la fonction ARRAY_AGG()
.
ARRAY_LENGTH()
pour compter le nombre de pages et de produits qui ont été visualisés :DISTINCT
à la fonction ARRAY_AGG()
:Cliquez sur Vérifier ma progression pour valider l'objectif.
Résumé
Les tableaux vous permettent de faire des choses très utiles comme :
ARRAY_LENGTH(<array>)
;ARRAY_AGG(DISTINCT <field>)
;ARRAY_AGG(<field> ORDER BY <field>)
;ARRAY_AGG(<field> LIMIT 5)
.L'ensemble de données public de BigQuery pour Google Analytics (bigquery-public-data.google_analytics_sample
) comprend beaucoup plus de champs et de lignes que celui de notre atelier (data-to-insights.ecommerce.all_sessions
). Mais surtout, il stocke déjà nativement des valeurs de champs (produits, pages et transactions, par exemple) sous la forme d'objets ARRAY.
Exécutez la requête.
Parcourez les résultats jusqu'à ce que vous trouviez le champ hits.product.v2ProductName
(nous aborderons très bientôt les alias de champs multiples).
Le nombre de champs disponibles dans le schéma Google Analytics peut être trop important pour une analyse.
Vous recevez le message d'erreur suivant :
Error:Cannot access field page on a value with type ARRAY<STRUCT<hitNumber INT64, time INT64, hour INT64, ...>> at [3:8]
Pour pouvoir interroger des champs REPEATED (tableaux) normalement, vous devez tout d'abord fractionner ces tableaux en lignes.
Par exemple, le tableau associé à hits.page.pageTitle
est actuellement stocké sous la forme d'une ligne unique semblable à ceci :
et il doit se présenter ainsi :
Comment faire cela avec SQL ?
Réponse : En appliquant la fonction UNNEST() à votre champ de tableau :
Nous parlerons de UNNEST() plus tard. Pour le moment, notez simplement les points suivants :
Cliquez sur Vérifier ma progression pour valider l'objectif.
Vous vous êtes peut-être demandé pourquoi l'alias de champ hit.page.pageTitle
ressemble à trois champs séparés par un point. Tout comme les valeurs ARRAY vous donnent la possibilité d'accroître la précision de vos champs, un autre type de données vous permet d'élargir la portée des requêtes dans votre schéma en regroupant des champs associés. Il s'agit du type de données SQL STRUCT.
Pour comprendre facilement ce qu'est un objet STRUCT, il suffit de se le représenter comme une table distincte qui est préjointe à votre table principale.
Un objet STRUCT peut inclure :
Cela ressemble à une table, n'est-ce pas ?
Pour ouvrir l'ensemble de données bigquery-public-data, cliquez sur + AJOUTER, sélectionnez Ajouter un projet aux favoris en saisissant son nom, puis saisissez le nom bigquery-public-data
.
Cliquez sur Ajouter aux favoris.
Le projet bigquery-public-data
apparaît désormais dans la section "Explorateur".
Ouvrez bigquery-public-data.
Recherchez et ouvrez l'ensemble de données google_analytics_sample.
Cliquez sur la table ga_sessions(366)_.
Commencez à faire défiler le schéma, puis répondez à la question suivante en utilisant la fonction de recherche de votre navigateur.
Comme vous pouvez l'imaginer, un site Web d'e-commerce moderne peut stocker un volume impressionnant de données de sessions.
Le principal intérêt d'une table comportant 32 objets STRUCT est que cela permet d'exécuter des requêtes comme celle-ci sans jointures :
.*
indique à BigQuery de retourner tous les champs pour cet objet STRUCT (comme il le ferait si totals.*
était une table distincte avec laquelle une jointure existait).Lorsque vous stockez vos grandes tables de rapport sous la forme d'objets STRUCT ("tables" préjointes) et ARRAY (précision accrue), vous pouvez :
L'ensemble de données suivant contient les temps mis par des coureurs pour réaliser un tour de piste. Chaque tour sera nommé "split" (tour de piste).
Ligne |
runner.name |
runner.split |
1 |
Rudisha |
23.4 |
Que remarquez-vous concernant les alias de champ ? En raison de la présence de champs imbriqués dans l'objet struct ("name" et "split" sont un sous-ensemble de "runner"), vous obtenez une notation par points.
Comment associer le coureur à plusieurs temps pour chaque tour d'une même course ?
Avec un tableau bien sûr !
Ligne |
runner.name |
runner.splits |
1 |
Rudisha |
23.4 |
26.3 | ||
26.4 | ||
26.1 |
En résumé :
Créez un ensemble de données nommé racing
.
Cliquez sur l'ensemble de données racing
, puis sur "Créer une table".
cloud-training/data-insights-course/labs/optimizing-for-performance/race_results.json
.Nommez la nouvelle table race_results
.
Cliquez sur Créer une table.
Une fois le chargement effectué, affichez l'aperçu du schéma associé à la table que vous venez de créer :
Quel champ correspond à l'objet STRUCT ? Comment le savez-vous ?
Le champ participants correspond à l'objet STRUCT, car il est du type RECORD.
Quel champ correspond à l'objet ARRAY ?
Le champ participants.splits
est un tableau de valeurs flottantes à l'intérieur de l'objet struct participants
parent. Il possède un mode REPEATED qui indique un tableau. On dit que les valeurs de ce tableau sont imbriquées, car plusieurs valeurs sont présentes dans un champ unique.
Cliquez sur Vérifier ma progression pour valider l'objectif.
Combien de lignes ont été renvoyées ?
Réponse : 1
Comment procéder si vous voulez lister le nom de chaque coureur et le type de course ?
Error: Cannot access field name on a value with type ARRAY<STRUCT<name STRING, splits ARRAY<FLOAT64>>>> at [2:27]
Le résultat est très semblable à celui qui vous serait renvoyé si vous omettiez l'instruction GROUP BY avec les fonctions d'agrégation. Il existe ici deux niveaux de précision différents : une ligne pour la course et trois lignes pour les noms des participants. Comment transformer ceci...
Ligne |
race |
participants.name |
1 |
800M |
Rudisha |
2 |
??? |
Makhloufi |
3 |
??? |
Murphy |
...en ceci :
Ligne |
race |
participants.name |
1 |
800M |
Rudisha |
2 |
800M |
Makhloufi |
3 |
800M |
Murphy |
Avec une base de données relationnelle SQL traditionnelle comportant une table des courses et une table des participants, comment procéderiez-vous pour obtenir des informations à partir de ces deux tables ? Vous utiliseriez la commande JOIN pour les joindre. Ici, l'objet STRUCT des participants (qui est très semblable du point de vue conceptuel à une table) fait déjà partie de votre table des courses, mais il n'est pas encore correctement corrélé à votre champ non-STRUCT "race".
Quelle commande SQL en deux mots pourriez-vous utiliser pour corréler la course de 800 mètres avec chacun des coureurs de la première table ?
Réponse : CROSS JOIN
Parfait.
Ensemble de données manquant pour la table "participants", alors qu'aucun ensemble de données par défaut n'est défini dans la requête
.
Bien que l'objet STRUCT des participants soit semblable à une table, techniquement il s'agit toujours d'un champ de la table racing.race_results
.
Félicitations ! Vous avez réussi à afficher la liste de tous les coureurs de chaque course.
Ligne |
race |
name |
1 |
800M |
Rudisha |
2 |
800M |
Makhloufi |
3 |
800M |
Murphy |
4 |
800M |
Bosse |
5 |
800M |
Rotich |
6 |
800M |
Lewandowski |
7 |
800M |
Kipketer |
8 |
800M |
Berian |
Le résultat de la requête sera identique :
S'il y a plusieurs types de courses (800M, 100M, 200M), une commande CROSS JOIN n'aurait-elle pas seulement pour effet d'associer chaque nom de coureur à chaque course possible de la même manière qu'un produit cartésien ?
Réponse : Non. Il s'agit ici d'une jointure croisée corrélée qui ne désimbrique que les éléments associés à une ligne unique. Pour plus de détails, consultez la page consacrée à l'utilisation des objets ARRAY et STRUCT.
Résumé concernant les objets STRUCT :
STRUCT(``"Rudisha" as name, [23.4, 26.3, 26.4, 26.1] as splits``)`` AS runner
Répondez aux questions ci-dessous en vous servant de la table racing.race_results
que vous avez créée précédemment.
Tâche : écrire une requête pour compter (COUNT) le nombre total de coureurs.
FROM
.Solution possible :
Ligne |
racer_count |
1 |
8 |
Réponse : 8 coureurs ont participé à cette course.
Cliquez sur Vérifier ma progression pour valider l'objectif.
Rédigez une requête qui listera le temps de course total pour les coureurs dont le nom commence par R. Classez les résultats par ordre décroissant du meilleur temps total. Utilisez l'opérateur UNNEST() avec la requête partiellement rédigée ci-dessous.
Solution possible :
Ligne |
name |
total_race_time |
1 |
Rudisha |
102.19999999999999 |
2 |
Rotich |
103.6 |
Cliquez sur Vérifier ma progression pour valider l'objectif.
Vous avez pu constater que le tour de piste le plus rapide enregistré pour la course de 800 mètres a été effectué en 23,2 secondes, mais vous n'avez pas identifié le coureur qui a réalisé ce temps. Créez une requête qui renvoie ce résultat.
Solution possible :
Ligne |
name |
split_time |
1 |
Kipketer |
23.2 |
Cliquez sur Vérifier ma progression pour valider l'objectif.
Vous avez ingéré des ensembles de données JSON, créé des objets ARRAY et STRUCT, et désimbriqué des données semi-structurées pour en dégager des insights.
Les formations et certifications Google Cloud vous aident à tirer pleinement parti des technologies Google Cloud. Nos cours portent sur les compétences techniques et les bonnes pratiques à suivre pour être rapidement opérationnel et poursuivre votre apprentissage. Nous proposons des formations pour tous les niveaux, à la demande, en salle et à distance, pour nous adapter aux emplois du temps de chacun. Les certifications vous permettent de valider et de démontrer vos compétences et votre expérience en matière de technologies Google Cloud.
Dernière mise à jour du manuel : 3 février 2024
Dernier test de l'atelier : 25 août 2023
Copyright 2025 Google LLC. Tous droits réservés. Google et le logo Google sont des marques de Google LLC. Tous les autres noms d'entreprises et de produits peuvent être des marques des entreprises auxquelles ils sont associés.
Ce contenu n'est pas disponible pour le moment
Nous vous préviendrons par e-mail lorsqu'il sera disponible
Parfait !
Nous vous contacterons par e-mail s'il devient disponible
One lab at a time
Confirm to end all existing labs and start this one