
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 ist eine vollständig verwaltete, automatisierte und kostengünstige Analysedatenbank von Google. Mit diesem Tool können Sie mehrere Terabyte an Daten abfragen und müssen dabei weder eine Infrastruktur verwalten, noch benötigen Sie einen Datenbankadministrator. BigQuery basiert auf SQL und die Abrechnung erfolgt nach dem „Pay as you go"-Modell. Mithilfe von BigQuery können Sie sich auf die Datenanalyse konzentrieren und wichtige Informationen erhalten.
In diesem Lab arbeiten Sie mit semistrukturierten Daten (JSON-Daten aufnehmen, Array-Datentypen) in BigQuery. Durch das Denormalisieren eines Schemas in eine einzelne Tabelle mit verschachtelten und wiederkehrenden Feldern lassen sich Leistungsverbesserungen erzielen. Die SQL-Syntax kann jedoch kompliziert sein, wenn mit Array-Daten gearbeitet wird. Sie üben, wie Sie verschiedene semistrukturierte Datasets laden und abfragen, Probleme beheben und Verschachtelungen aufheben.
Aufgaben in diesem Lab:
Lesen Sie diese Anleitung. Labs sind zeitlich begrenzt und können nicht pausiert werden. Der Timer beginnt zu laufen, wenn Sie auf Lab starten klicken, und zeigt Ihnen, wie lange Google Cloud-Ressourcen für das Lab verfügbar sind.
In diesem praxisorientierten Lab können Sie die Lab-Aktivitäten in einer echten Cloud-Umgebung durchführen – nicht in einer Simulations- oder Demo-Umgebung. Dazu erhalten Sie neue, temporäre Anmeldedaten, mit denen Sie für die Dauer des Labs auf Google Cloud zugreifen können.
Für dieses Lab benötigen Sie Folgendes:
Klicken Sie auf Lab starten. Wenn Sie für das Lab bezahlen müssen, wird ein Dialogfeld geöffnet, in dem Sie Ihre Zahlungsmethode auswählen können. Auf der linken Seite befindet sich der Bereich „Details zum Lab“ mit diesen Informationen:
Klicken Sie auf Google Cloud Console öffnen (oder klicken Sie mit der rechten Maustaste und wählen Sie Link in Inkognitofenster öffnen aus, wenn Sie Chrome verwenden).
Im Lab werden Ressourcen aktiviert. Anschließend wird ein weiterer Tab mit der Seite „Anmelden“ geöffnet.
Tipp: Ordnen Sie die Tabs nebeneinander in separaten Fenstern an.
Kopieren Sie bei Bedarf den folgenden Nutzernamen und fügen Sie ihn in das Dialogfeld Anmelden ein.
Sie finden den Nutzernamen auch im Bereich „Details zum Lab“.
Klicken Sie auf Weiter.
Kopieren Sie das folgende Passwort und fügen Sie es in das Dialogfeld Willkommen ein.
Sie finden das Passwort auch im Bereich „Details zum Lab“.
Klicken Sie auf Weiter.
Klicken Sie sich durch die nachfolgenden Seiten:
Nach wenigen Augenblicken wird die Google Cloud Console in diesem Tab geöffnet.
Zuerst wird das Fenster Willkommen bei BigQuery in der Cloud Console geöffnet, das neben allgemeinen Informationen auch einen Link zur Kurzanleitung und zu den Versionshinweisen enthält.
Die BigQuery Console wird geöffnet.
Nennen Sie das neue Dataset fruit_store
. Für die restlichen Optionen können Sie die Standardwerte beibehalten (Speicherort der Daten, Standard-Tabellenablauf).
Klicken Sie auf Dataset erstellen.
Normalerweise gibt es in SQL für jede Zeile einen einzigen Wert, wie z. B. in folgender Liste von Obstsorten:
Zeile |
Obstsorte |
1 |
Himbeere |
2 |
Brombeere |
3 |
Erdbeere |
4 |
Kirsche |
Was wäre aber, wenn Sie eine Liste von Obstartikeln für jede Person im Geschäft sehen möchten? Die Ausgabe könnte in diesem Fall ungefähr so aussehen:
Zeile |
Obstsorte |
Person |
1 |
Himbeere |
Sarah |
2 |
Brombeere |
Sarah |
3 |
Erdbeere |
Sarah |
4 |
Kirsche |
Sarah |
5 |
Orange |
Frederick |
6 |
Apfel |
Frederick |
In einer traditionellen relationalen SQL-Datenbank würden Sie nach sich wiederholenden Namen suchen und die obige Tabelle in zwei separate Tabellen aufteilen, nämlich „Obstsorten“ und „Personen“. Dieser Vorgang heißt Normalisierung und beschreibt die Aufteilung von Tabellenspalten in mehrere Tabellen. Für transaktionale Datenbanken wie mySQL ist das eine gängige Methode.
Im Data-Warehouse-Prozess wird der Vorgang oft umgekehrt: Bei der Denormalisierung werden viele Einzeltabellen zu einer großen Berichtstabelle zusammengeführt.
Jetzt lernen Sie eine weitere Methode kennen, bei der Daten in verschiedenen Detaillierungsgraden mithilfe wiederkehrender Felder in einer Tabelle gespeichert werden:
Zeile |
Obstsorte (Array) |
Person |
1 |
Himbeere |
Sarah |
Brombeere | ||
Erdbeere | ||
Kirsche | ||
2 |
Orange |
Frederick |
Apfel |
Was fällt Ihnen an der Tabelle auf?
Das sind die Merkmale des Datentyps Array
.
So lässt sich das Obstsorten-Array leichter interpretieren:
Zeile |
Obstsorte (Array) |
Person |
1 |
[Himbeere, Brombeere, Erdbeere, Kirsche] |
Sarah |
2 |
[Orange, Apfel] |
Frederick |
Beide Tabellen drücken exakt dasselbe aus. Daraus folgen zwei wichtige Erkenntnisse:
Sie können es selbst ausprobieren.
Klicken Sie auf Ausführen.
Probieren Sie danach folgenden Befehl aus:
Sie sollten jetzt eine Fehlermeldung erhalten, die so aussieht:
Error: Array elements of types {INT64, STRING} do not have a common supertype at [3:1]
(Fehler: Array-Elemente mit den Typen {INT64, STRING} haben keinen gemeinsamen Supertypen [3:1])
In Arrays kann jeweils nur ein Datentyp verwendet werden: nur Strings oder nur Zahlen.
Klicken Sie auf Ausführen.
Nachdem Sie sich die Ergebnisse angesehen haben, klicken Sie auf den Tab JSON, um die verschachtelte Struktur der Ergebnisse aufzurufen.
Angenommen, Sie haben eine JSON-Datei, die in BigQuery aufgenommen werden soll. Wie gehen Sie vor?
Erstellen Sie im Dataset eine neue Tabelle mit dem Namen fruit_details
.
fruit_store
.Daraufhin wird die Option Tabelle erstellen angezeigt.
cloud-training/data-insights-course/labs/optimizing-for-performance/shopping_cart.json
Nennen Sie die neue Tabelle fruit_details
.
Aktivieren Sie das Kästchen Schema (Automatisch erkennen).
Klicken Sie auf Tabelle erstellen.
Im Schema sehen Sie, dass fruit_array
als REPEATED (wiederkehrend) markiert ist. Damit wird angezeigt, dass es sich um ein Array handelt.
Zusammenfassung
Klicken Sie auf Fortschritt prüfen.
Wenn Sie noch keine Arrays in Ihren Tabellen haben, können Sie sie erstellen.
Verwenden Sie jetzt die Funktion ARRAY_AGG()
, um unsere Stringwerte in einem Array zu aggregieren.
ARRAY_LENGTH()
anschließend die Seiten und Produkte, die angesehen wurden:DISTINCT
zu ARRAY_AGG()
hinzu:Klicken Sie auf Fortschritt prüfen.
Zusammenfassung
Mit Arrays lassen sich viele nützliche Dinge tun:
ARRAY_LENGTH(<Array>)
ARRAY_AGG(DISTINCT <Feld>)
ARRAY_AGG(<Feld> ORDER BY <Feld>)
ARRAY_AGG(<Feld> LIMIT 5)
Im öffentlichen BigQuery-Dataset für Google Analytics bigquery-public-data.google_analytics_sample
sind viel mehr Felder und Zeilen vorhanden als im Dataset data-to-insights.ecommerce.all_sessions
für dieses Lab. Noch interessanter ist jedoch, dass die Feldwerte wie Produkte, Seiten und Transaktionen bereits nativ als Arrays gespeichert sind.
Klicken Sie auf Ausführen.
Scrollen Sie in den Ergebnissen nach rechts, bis Sie zum Feld hits.product.v2ProductName
gelangen. Wir behandeln demnächst mehrere Feldaliasse.
Die Anzahl der Felder, die im Google Analytics-Schema zur Verfügung steht, kann die Analyse überlasten.
Sie erhalten einen Fehler:
Fehler:Cannot access field page on a value with type ARRAY<STRUCT<hitNumber INT64, time INT64, hour INT64, ...>> at [3:8]
Bevor Sie REPEATED-Felder (Arrays) wie gewohnt abfragen können, müssen die Arrays zuerst in Zeilen aufgeteilt werden.
Das Array für hits.page.pageTitle
ist zurzeit als einzelne Zeile gespeichert:
Es sollte aber so aussehen:
Wie können Sie das mit SQL machen?
Antwort: Nutzen Sie dazu die Funktion UNNEST() in Ihrem Array-Feld:
Mehr zu UNNEST() später. Wichtig für den Moment ist Folgendes:
Klicken Sie auf Fortschritt prüfen.
Sie fragen sich vielleicht, warum der Feldalias hit.page.pageTitle
wie drei Felder aussieht, die jeweils durch Punkte getrennt sind. So wie Sie mit ARRAY-Werten tief in den Detaillierungsgrad der Felder eintauchen, ermöglicht ein weiterer Datentyp einen breiten Blick auf das Schema, weil verwandte Felder gruppiert werden. Dieser SQL-Datentyp heißt STRUCT.
Einen STRUCT kann man sich wie eine separate Tabelle vorstellen, die schon vorab mit Ihrer Haupttabelle verknüpft wurde.
Ein STRUCT zeichnet sich durch Folgendes aus:
Klingt zunächst einmal wie eine ganz normale Tabelle.
Zum Öffnen des Datasets bigquery-public-data klicken Sie auf +Hinzufügen. Wählen Sie dann Projekt nach Name markieren aus und geben Sie den Namen bigquery-public-data
ein.
Klicken Sie auf Markieren.
Das Projekt bigquery-public-data
wird im Abschnitt „Explorer“ aufgelistet.
Öffnen Sie bigquery-public-data.
Öffnen Sie darin das Dataset google_analytics_sample.
Klicken Sie auf die Tabelle ga_sessions(366)_.
Scrollen Sie durch das Schema und beantworten Sie die folgende Frage. Nutzen Sie dazu die Suchfunktion des Browsers.
Für moderne E-Commerce-Websites werden sehr viele Sitzungsdaten gespeichert.
Der eigentliche Vorteil von 32 STRUCTs in einer Tabelle ist, dass Sie Abfragen dieser Art ohne JOINs ausführen können:
.*
erhält BigQuery die Anweisung, alle Felder für diesen STRUCT zurückzugeben. Das wäre auch so, wenn totals.*
eine separate Tabelle wäre, die Sie mit dieser zusammenführen.Wenn Sie große Berichtstabellen als STRUCTs (vorab verknüpfte „Tabellen“) und ARRAYs (mit hohem Detaillierungsgrad) speichern, bringt das folgende Vorteile:
Das nächste Dataset enthält Rundenzeiten von Läuferinnen und Läufern. Jede Runde wird als „Split“ bezeichnet.
Zeile |
runner.name |
runner.split |
1 |
Rudisha |
23.4 |
Was fällt Ihnen an den Feldaliassen auf? Da der STRUCT-Container verschachtelte Felder enthält ("name" und "split" sind Teilmengen von "runner"), wird eine Punktnotation verwendet.
Wie gehen Sie vor, wenn für einen Läufer mehrere Splits in einem Rennen vorhanden sind, wie etwa verschiedene Rundenzeiten?
In diesem Fall eignet sich ein Array.
Zeile |
runner.name |
runner.splits |
1 |
Rudisha |
23.4 |
26.3 | ||
26.4 | ||
26.1 |
Zusammenfassung:
Erstellen Sie ein neues Dataset mit dem Namen racing
.
Klicken Sie auf das Dataset racing
und dann auf „Tabelle erstellen“.
cloud-training/data-insights-course/labs/optimizing-for-performance/race_results.json
Nennen Sie die neue Tabelle race_results
.
Klicken Sie auf Tabelle erstellen.
Lassen Sie sich nach dem erfolgreichen Ladevorgang eine Vorschau des Schemas für die neu erstellte Tabelle anzeigen:
Welches Feld ist der STRUCT? Woran erkennen Sie das?
Das Feld participants ist der STRUCT, da es vom Typ RECORD ist.
Welches Feld ist das ARRAY?
Das Feld participants.splits
ist ein Array aus Gleitkommazahlen innerhalb des STRUCTs participants
. Es hat den REPEATED-Modus, was auf einen Array hinweist. Werte aus diesem Array werden als verschachtelte Werte bezeichnet, da es sich um mehrere Werte in einem einzelnen Feld handelt.
Klicken Sie auf Fortschritt prüfen.
Wie viele Zeilen wurden ausgegeben?
Antwort: 1
Wie können Sie den Namen aller Läuferinnen und Läufer und den Typ des Rennens auflisten?
Fehler: Cannot access field name on a value with type ARRAY<STRUCT<name STRING, splits ARRAY<FLOAT64>>>> at [2:27]
Ähnlich wie beim Weglassen von GROUP BY bei Aggregationsfunktionen werden zwei verschiedene Detaillierungsgrade dargestellt: Eine Zeile für das Rennen und drei Zeilen für die Namen der Teilnehmer. Sie müssen also…
Zeile |
race |
participants.name |
1 |
800M |
Rudisha |
2 |
??? |
Makhloufi |
3 |
??? |
Murphy |
…in Folgendes ändern:
Zeile |
race |
participants.name |
1 |
800M |
Rudisha |
2 |
800M |
Makhloufi |
3 |
800M |
Murphy |
Wie würden Sie bei einer traditionellen relationalen SQL-Datenbank vorgehen, wenn Sie eine „races"-Tabelle und eine „participants"-Tabelle haben und Informationen aus beiden Tabellen erhalten möchten? Sie würden sie mit einem JOIN zusammenführen. Das „participant"-STRUCT ähnelt konzeptionell stark einer Tabelle und ist bereits Teil Ihrer „races"-Tabelle, korreliert jedoch nicht korrekt mit dem Nicht-STRUCT-Feld „race".
Fällt Ihnen ein SQL-Befehl aus zwei Wörtern ein, mit dem Sie den Wert „800M" aus der „races"-Tabelle mit jedem Läufer aus der ersten Tabelle korrelieren können?
Antwort: CROSS JOIN
Prima!
Table name "participants" missing dataset while no default dataset is set in the request
.
Obwohl der „participants“-STRUCT wie eine Tabelle aussieht, ist er eigentlich immer noch ein Feld in der Tabelle racing.race_results
.
Sehr gut. Sie haben erfolgreich alle Läufer für jedes Rennen aufgelistet.
Zeile |
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 |
Sie erhalten dann dasselbe Abfrageergebnis:
Würde ein CROSS JOIN bei mehreren Renntypen (800M, 100M, 200M) nicht einfach jeden Läufernamen als kartesisches Produkt mit jedem möglichen Renntypen verknüpfen?
Antwort: Nein. Es ist ein korrelierter Cross Join, mit dem nur die Elemente entpackt werden, die mit einer einzelnen Zeile verknüpft sind. Weitere Informationen finden Sie in der Dokumentation Mit Arrays arbeiten.
Zusammenfassung zu STRUCTs:
STRUCT(``"Rudisha" as name, [23.4, 26.3, 26.4, 26.1] as splits``)`` AS runner
Beantworten Sie die Fragen unten anhand der Tabelle racing.race_results
, die Sie bereits erstellt haben.
Aufgabe: Führen Sie eine COUNT-Abfrage aus, um zu erfahren, wie viele Läufer insgesamt am Rennen teilgenommen haben.
FROM
-Befehl mit einem Cross Join als zusätzliche Datenquelle hinzufügen müssen.Mögliche Lösung:
Zeile |
racer_count |
1 |
8 |
Antwort: Am Rennen haben 8 Läufer teilgenommen.
Klicken Sie auf Fortschritt prüfen.
Schreiben Sie eine Abfrage, mit der die Laufzeit der Teilnehmenden aufgelistet wird, deren Name mit R beginnt. Ordnen Sie die Liste nach der Gesamtzeit und beginnen Sie mit der schnellsten Zeit. Verwenden Sie den Operator UNNEST() in der folgenden unvollständigen Abfrage.
Mögliche Lösung:
Zeile |
name |
total_race_time |
1 |
Rudisha |
102.19999999999999 |
2 |
Rotich |
103.6 |
Klicken Sie auf Fortschritt prüfen.
Sie haben gesehen, dass die schnellste Rundenzeit, die für das 800-Meter-Rennen aufgezeichnet wurde, 23,2 Sekunden betrug. Sie haben jedoch nicht herausgefunden, welche Läuferin oder welcher Läufer diese Runde gelaufen ist. Erstellen Sie eine Abfrage, mit der das ausgegeben wird.
Mögliche Lösung:
Zeile |
name |
split_time |
1 |
Kipketer |
23.2 |
Klicken Sie auf Fortschritt prüfen.
Sie haben erfolgreich JSON-Datasets aufgenommen, ARRAYs und STRUCTs erstellt und die Verschachtelung semistrukturierter Daten aufgehoben, um neue Informationen abzurufen.
In unseren Schulungen erfahren Sie alles zum optimalen Einsatz unserer Google Cloud-Technologien und können sich entsprechend zertifizieren lassen. Unsere Kurse vermitteln technische Fähigkeiten und Best Practices, damit Sie möglichst schnell mit Google Cloud loslegen und Ihr Wissen fortlaufend erweitern können. Wir bieten On-Demand-, Präsenz- und virtuelle Schulungen für Anfänger wie Fortgeschrittene an, die Sie individuell in Ihrem eigenen Zeitplan absolvieren können. Mit unseren Zertifizierungen weisen Sie nach, dass Sie Experte im Bereich Google Cloud-Technologien sind.
Anleitung zuletzt am 3. Februar 2024 aktualisiert
Lab zuletzt am 25. August 2023 getestet
© 2025 Google LLC. Alle Rechte vorbehalten. Google und das Google-Logo sind Marken von Google LLC. Alle anderen Unternehmens- und Produktnamen können Marken der jeweils mit ihnen verbundenen Unternehmen sein.
Diese Inhalte sind derzeit nicht verfügbar
Bei Verfügbarkeit des Labs benachrichtigen wir Sie per E-Mail
Sehr gut!
Bei Verfügbarkeit kontaktieren wir Sie per E-Mail
One lab at a time
Confirm to end all existing labs and start this one