In dieser Anleitung wird gezeigt, wie Sie mit Dataflow Daten aus einer relationalen OLTP-Datenbank (Datenbank zur Online-Transaktionsverarbeitung) extrahieren und transformieren und anschließend zur Analyse in BigQuery laden können.
Diese Anleitung richtet sich an Datenbankadministratoren, Betriebsexperten und Cloud-Architekten, die die Abfragefunktionen von BigQuery zu Analysezwecken und die Batchverarbeitungsfunktionen von Dataflow nutzen möchten.
OLTP-Datenbanken sind oft relationale Datenbanken, die für E-Commerce-Seiten, SaaS-Anwendungen (Software as a Service) oder Spiele Informationen speichern und Transaktionen verarbeiten. OLTP-Datenbanken sind normalerweise für Transaktionen optimiert, die die ACID-Attribute erfordern: Atomarität, Konsistenz, Isolation und Langlebigkeit (Atomicity, Consistency, Isolation, Durability). Ihre Schemas sind in der Regel stark normalisiert. Data Warehouses tendieren hingegen dazu, für den Datenabruf und die Datenanalyse statt für Transaktionen optimiert zu sein, und haben meist denormalisierte Schemas. Allgemein werden Daten durch die Denormalisierung aus einer OLTP-Datenbank nützlicher für die Analyse in BigQuery.
Ziele
In der Anleitung werden zwei Ansätze dafür gezeigt, wie normalisierte RDBMS-Daten (Relational Database Management System) durch Extrahieren, Transformieren und Laden (ETL) in denormalisierte BigQuery-Daten umgewandelt werden können:
- BigQuery zum Laden und Transformieren der Daten verwenden: Nutzen Sie diesen Ansatz, um ein einmaliges Laden einer kleinen Datenmenge in BigQuery für die Analyse durchzuführen. Sie können diesen Ansatz auch verwenden, um für Ihr Dataset einen Prototyp zu erstellen, bevor Sie die Automatisierung mit großen oder mehreren Datasets nutzen.
- Dataflow zum Laden, Transformieren und Bereinigen der Daten verwenden: Nutzen Sie diesen Ansatz, um größere Datenmengen oder Daten aus mehreren Datenquellen zu laden oder Daten schrittweise oder automatisch zu laden.
Kosten
In dieser Anleitung werden die folgenden kostenpflichtigen Komponenten von Google Cloud verwendet:
Mit dem Preisrechner können Sie eine Kostenschätzung für Ihre voraussichtliche Nutzung vornehmen. Neuen Google Cloud-Nutzern steht möglicherweise eine kostenlose Testversion zur Verfügung.
Nach Abschluss dieser Anleitung können Sie weitere Kosten vermeiden, indem Sie die erstellten Ressourcen löschen. Weitere Informationen finden Sie unter Bereinigen.
Vorbereitung
-
Melden Sie sich bei Ihrem Google-Konto an.
Wenn Sie noch kein Konto haben, melden Sie sich hier für ein neues Konto an.
-
Wählen Sie in der Google Cloud Console auf der Seite der Projektauswahl ein Google Cloud-Projekt aus oder erstellen Sie eines.
-
Die Abrechnung für das Cloud-Projekt muss aktiviert sein. So prüfen Sie, ob die Abrechnung für Ihr Projekt aktiviert ist.
- Compute Engine und Dataflow APIs aktivieren.
- Installieren und initialisieren Sie das Cloud SDK.
MusicBrainz-Datasets verwenden
Diese Anleitung beruht auf JSON-Snapshots von Tabellen in der MusicBrainz-Datenbank, die auf PostgreSQL basiert und Informationen über die gesamte MusicBrainz-Musik enthält. Zu den Elementen des MusicBrainz-Schemas gehören:
- Interpreten
- Versionsgruppen
- Versionen
- Aufnahmen
- Works
- Labels
- Viele Beziehungen zwischen diesen Elementen
Das MusicBrainz-Schema umfasst drei relevante Tabellen: artist
, recording
und artist_credit_name
. artist_credit
steht für die Zuordnung einer Aufnahme zu einem Interpreten. Die Zeilen artist_credit_name
verknüpfen die Aufnahme mit dem entsprechenden Interpreten über den artist_credit
-Wert.
Diese Anleitung enthält die PostgreSQL-Tabellen, die bereits in das JSON-Format extrahiert wurden. Sie können den folgenden Beispielcode verwenden, um diesen Schritt selbst auszuführen:
pg_cmd="\\copy (select row_to_json(r) from (select * from artist) r ) to
exported_artist.json"
psql -w -h $host -U $user -d $db -c $pg_cmd
sed -i -e 's/\\\\/\\/g' exported_artist.json # clean up extra '\' characters
Ansatz 1: ETL mit BigQuery
Nutzen Sie diesen Ansatz, um ein einmaliges Laden einer kleinen Datenmenge in BigQuery für die Analyse durchzuführen. Sie können diesen Ansatz auch nutzen, um für Ihr Dataset einen Prototyp zu erstellen, bevor Sie die Automatisierung mit großen oder mehreren Datasets nutzen.
BigQuery-Dataset erstellen
Das folgende Diagramm zeigt die Schritte, die Sie zum Erstellen eines BigQuery-Datasets ausführen:
Sie laden die MusicBrainz-Tabellen einzeln in BigQuery und führen die geladenen Tabellen anschließend zusammen, sodass jede Zeile die von Ihnen gewünschte Datenverknüpfung enthält. Die Join-Ergebnisse speichern Sie in einer neuen BigQuery-Tabelle. Dann können Sie die ursprünglichen Tabellen, die Sie geladen haben, löschen.
Öffnen Sie in der Cloud Console BigQuery.
Klicken Sie unter Ressourcen auf den Namen Ihres Projekts.
Klicken Sie im linken Navigationsbereich auf + Daten hinzufügen.
Führen Sie im Dialogfeld Dataset erstellen die folgenden Schritte aus:
- Geben Sie im Feld Dataset-ID den Wert
musicbrainz
ein. - Behalten Sie für Speicherort der Daten den Wert Standard bei.
- Geben Sie im Feld Dataset-ID den Wert
Klicken Sie auf Dataset erstellen.
MusicBrainz-Tabellen importieren
Führen Sie für jede MusicBrainz-Tabelle die folgenden Schritte aus, um die Tabellen in das von Ihnen erstellte Dataset einzufügen:
- Klicken Sie in der Cloud Console auf den Dataset-Namen und dann auf Tabelle erstellen.
Führen Sie im Dialogfeld Tabelle erstellen die folgenden Schritte aus und klicken Sie dann auf Tabelle erstellen:
- Wählen Sie unter Quelle in der Drop-down-Liste Tabelle erstellen aus die Option Google Cloud Storage aus.
- Geben Sie im Feld Select file from GCS bucket die URL für die Datendatei ein:
gs://solutions-public-assets/bqetl/artist.json
. - Wählen Sie für Dateiformat den Eintrag JSON (Newline Delimited) aus.
- Geben Sie unter Tabellenname den Tabellennamen ein:
artist
. - Lassen Sie unter Tabellentyp den Wert Native Tabelle ausgewählt.
- Klicken Sie unter dem Abschnitt Schema auf Als Text bearbeiten.
- Laden Sie die Schemadatei
artist
herunter. - Ersetzen Sie den Inhalt im Abschnitt Schema durch den Inhalt der Schemadatei, die Sie heruntergeladen haben.
Warten Sie einen Moment, bis der Ladejob beendet ist. Klicken Sie zum Überwachen des Jobs auf Job History (Jobverlauf).
Nach Abschluss des Ladejobs wird die neue Tabelle im Dataset angezeigt.
Wiederholen Sie die Schritte 1 bis 3 mit den folgenden Änderungen für die Tabelle
artist_credit_name
:- Laden Sie die Schemadatei
artist_credit_name
herunter. - Geben Sie die folgende Datendatei-URL ein:
gs://solutions-public-assets/bqetl/artist_credit_name.json
- Laden Sie die Schemadatei
Wiederholen Sie die Schritte 1 bis 3 mit den folgenden Änderungen für die Tabelle
recording
:- Laden Sie die Schemadatei
recording
herunter. - Geben Sie die folgende Datendatei-URL ein:
gs://solutions-public-assets/bqetl/recording.json
- Laden Sie die Schemadatei
Daten manuell denormalisieren
Führen Sie die Daten zum Denormalisieren in einer neuen BigQuery-Tabelle zusammen, die eine Zeile für jede Aufnahme des Interpreten hat, gemeinsam mit ausgewählten Metadaten, die für die Analyse aufbewahrt werden sollen.
Kopieren Sie in der Cloud Console die folgende Abfrage und fügen Sie sie in den Abfrageeditor ein:
SELECT artist.id, artist.gid as artist_gid, artist.name as artist_name, artist.area, recording.name as recording_name, recording.length, recording.gid as recording_gid, recording.video FROM `[PROJECT_ID].[DATASET].artist` as artist INNER JOIN `[PROJECT_ID].[DATASET].artist_credit_name` AS artist_credit_name ON artist.id = artist_credit_name.artist INNER JOIN `[PROJECT_ID].[DATASET].recording` AS recording ON artist_credit_name.artist_credit = recording.artist_credit
Ersetzen Sie
[DATASET]
durch den Namen des zuvor erstellten Datasets, z. B.musicbrainz
, und[PROJECT_ID]
durch Ihre Google Cloud-Projekt-ID.Klicken Sie auf die Drop-down-Liste Mehr und wählen Sie dann Abfrageeinstellungen aus.
Führen Sie auf der Karte Query settings (Abfrageeinstellungen) die folgenden Schritte aus:
- Klicken Sie das Kästchen Legen Sie eine Zieltabelle für Abfrageergebnisse fest an.
- Geben Sie unter Tabellenname
recordings_by_artists_manual.
ein. - Klicken Sie für Schreibeinstellung für Zieltabelle auf Tabelle überschreiben.
- Klicken Sie auf das Kästchen Allow large results (no size limit) (Große Ergebnisse zulassen (kein Größenlimit)).
- Behalten Sie für Job Priority (Priorität des Jobs) die Standardeinstellung Interactive (Interaktiv) bei.
- Behalten Sie für SQL dialect (SQL-Dialekt) die Standardeinstellung Standard bei.
- Klicken Sie auf Save (Speichern).
Klicken Sie auf Run (Ausführen).
Wenn die Abfrage abgeschlossen ist, werden die Daten aus dem Abfrageergebnis in der neu erstellten BigQuery-Tabelle bei jedem Interpreten in Lieder organisiert.
Ansatz 2: ETL in BigQuery mit Dataflow
In diesem Abschnitt der Anleitung verwenden Sie anstelle der BigQuery-UI ein Beispielprogramm, um Daten mithilfe einer Dataflow-Pipeline in BigQuery zu laden. Anschließend verwenden Sie das Programmiermodell von Dataflow, um die Daten, die in BigQuery geladen werden sollen, zu denormalisieren und zu bereinigen.
Sehen Sie sich zuerst die Konzepte und den Beispielcode an.
Konzepte
Obwohl die Datenmenge klein ist und mithilfe der BigQuery-UI schnell hochgeladen werden kann, verwenden Sie jetzt zu Lernzwecken Dataflow, um sie zu extrahieren, zu transformieren und zu laden (ETL). Normalerweise bietet es sich eher bei sehr umfassenden Joins an, anstelle der BigQuery-UI Dataflow zum Extrahieren, Transformieren und Laden von Daten in BigQuery zu verwenden, also bei etwa 500 bis 5.000 Spalten mit mehr als 10 TB Daten. Dabei wird Folgendes angestrebt:
- Sie möchten die Daten bereinigen oder transformieren, während sie in BigQuery geladen werden, statt sie zu speichern und anschließend zusammenzuführen. Bei diesem Ansatz sind daher die Speicheranforderungen geringer, weil die Daten in BigQuery nur in ihrem zusammengeführten, transformierten Zustand gespeichert werden.
- Sie möchten eine benutzerdefinierte Datenbereinigung vornehmen, was mit SQL allein nicht möglich ist.
- Sie planen, die Daten während des Ladevorgangs mit Daten außerhalb der OLTP zu kombinieren, wie etwa Logs oder per Fernzugriff gesteuerten Daten.
- Sie möchten das Testen und Bereitstellen der Logik zum Laden von Daten mit einer kontinuierlichen Integration oder kontinuierlichen Bereitstellung (Continuous Integration/Continuous Deployment, CI/CD) automatisieren.
- Sie erwarten eine allmähliche Iteration, Optimierung und Verbesserung des ETL-Prozesses.
- Sie planen, Daten stufenweise hinzuzufügen, statt einen einmaligen ETL-Schritt durchzuführen.
Es folgt ein Diagramm der Datenpipeline, die vom Beispielprogramm erstellt wird:
Im Beispielcode sind viele der Pipelineschritte gruppiert oder in praktische Methoden eingebettet. Sie erhalten aussagekräftige Namen und werden wiederverwendet. Im Diagramm werden wiederverwendete Schritte durch gestrichelte Linien dargestellt.
Pipelinecode
Der Code erstellt eine Pipeline, die die folgenden Schritte ausführt:
Lädt jede Tabelle, die Teil des Joins sein soll, in eine
PCollection
von Strings. Jedes Element umfasst die JSON-Darstellung einer Tabellenzeile.Konvertiert diese JSON-Strings in Objektdarstellungen (
MusicBrainzDataObject
-Objekte) und organisiert diese Objektdarstellungen nach einem der Spaltenwerte, z. B. einem Primär- oder Fremdschlüssel.Führt die Listen anhand eines gemeinsamen Interpreten zusammen.
artist_credit_name
verknüpft eine Interpretenzuordnung mit der Aufnahme und umfasst den Fremdschlüssel des Interpreten. Die Tabelleartist_credit_name
wird als Liste der SchlüsselwertobjekteKV
geladen. DasK
-Mitglied ist der Interpret.Führt die Listen über die Methode
MusicBrainzTransforms.innerJoin()
zusammen.- Gruppiert die Sammlungen von
KV
-Objekten nach dem Schlüsselmitglied, für das die Zusammenführung durchgeführt werden soll. Dies führt zu einerPCollection
vonKV
-Objekten mit einem langen Schlüssel (dem Spaltenwertartist.id
) und dem daraus resultierendenCoGbkResult
(steht für "Combine Group by Key Result"). DasCoGbkResult
-Objekt ist ein Tupel von Objektlisten mit dem gemeinsamen Schlüsselwert aus den ersten und zweitenPCollections
. Dieses Tupel ist mit dem für jedePCollection
formulierten Tupel-Tag vor dem Ausführen desCoGroupByKey
-Vorgangs in dergroup
-Methode erreichbar. Führt jeden Objektabgleich in einem Objekt
MusicBrainzDataObject
zusammen, das ein Verknüpfungsergebnis darstellt.Erkennt die Sammlung in einer Liste von
KV
-Objekten, um mit dem nächsten Join zu beginnen. Hier ist derK
-Wert die Spalteartist_credit
, die für den Join mit der Tabelle verwendet wird, die die Aufnahmen enthält.Erfasst die abschließend resultierende Sammlung von
MusicBrainzDataObject
-Objekten, indem dieses Ergebnis mit der geladenen Sammlung von Aufnahmen zusammengeführt wird, die nachartist_credit.id
organisiert sind.Bildet die resultierenden
MusicBrainzDataObjects
-Objekte inTableRows
ab.Schreibt die resultierenden
TableRows
in BigQuery.
- Gruppiert die Sammlungen von
Details zur Funktionsweise der Dataflow-Pipelineprogrammierung finden Sie in den folgenden Themen zum Programmiermodell:
PCollection
- Daten aus Textdateien laden (einschließlich Cloud Storage)
ParDo
,MapElements
undFlatMapElements
- Zusammenführen und
GroupByKey
- BigQuery IO
Nachdem Sie sich die Schritte angesehen haben, die der Code durchführt, können Sie die Pipeline ausführen.
Pipelinecode ausführen
Öffnen Sie Cloud Shell in der Cloud Console.
Legen Sie die Umgebungsvariablen für Ihr Projekt fest:
export PROJECT_ID=[PROJECT_ID] export ZONE=[CHOOSE_AN_APPROPRIATE_ZONE]
Ersetzen Sie
[PROJECT_ID]
durch die Projekt-ID Ihres Google Cloud-Projekts und[CHOOSE_AN_APPROPRIATE_ZONE]
durch eine Google Cloud-Zone.Legen Sie die Umgebungsvariablen fest, die vom Pipelineskript verwendet werden:
export DESTINATION_TABLE=recordings_by_artists_dataflow export STAGING_BUCKET=${PROJECT_ID}-etl-staging-bucket export DATASET=musicbrainz export SERVICE_ACCOUNT=project-owner
Achten Sie darauf, dass
gcloud
das Projekt verwendet, das Sie zu Beginn der Anleitung erstellt oder ausgewählt haben:gcloud config set project $PROJECT_ID
Erstellen Sie ein Dienstkonto, um die Pipeline auszuführen:
gcloud iam service-accounts create ${SERVICE_ACCOUNT} \ --display-name "Project Owner Account" gcloud projects add-iam-policy-binding ${PROJECT_ID} \ --member serviceAccount:${SERVICE_ACCOUNT}@${PROJECT_ID}.iam.gserviceaccount.com \ --role roles/owner gcloud iam service-accounts keys create \ ~/${PROJECT_ID}-${SERVICE_ACCOUNT}.json \ --iam-account ${SERVICE_ACCOUNT}@${PROJECT_ID}.iam.gserviceaccount.com
Mit diesem Befehl laden Sie eine JSON-Datei herunter, die den Dienstkontoschlüssel enthält. Speichern Sie diese Datei an einem sicheren Ort.
Legen Sie die Umgebungsvariable
GOOGLE_APPLICATION_CREDENTIALS
auf den Pfad der JSON-Datei fest, die den Dienstkontoschlüssel enthält:export GOOGLE_APPLICATION_CREDENTIALS=~/${PROJECT_ID}-${SERVICE_ACCOUNT}.json
Klonen Sie das Repository, das den Dataflow-Code enthält:
git clone https://github.com/GoogleCloudPlatform/bigquery-etl-dataflow-sample.git
Ändern Sie das Verzeichnis in das Beispiel:
cd bigquery-etl-dataflow-sample
Erstellen Sie in Cloud Storage einen Staging-Bucket, da für Dataflow-Jobs ein Cloud Storage-Bucket erforderlich ist, um die Binärdateien bereitzustellen, die zum Ausführen der Pipeline verwendet werden.
gsutil mb gs://$STAGING_BUCKET
Richten Sie den Objektlebenszyklus für
[STAGING_BUCKET_NAME]
entsprechend jenem in der Dateidataflow-staging-policy.json
ein.gsutil lifecycle set dataflow-staging-policy.json gs://$STAGING_BUCKET
Führen Sie den Dataflow-Job aus:
./run.sh simple
Wechseln Sie in der Cloud Console zur Seite Dataflow, um sich den Fortschritt der Pipeline anzusehen.
Der Status der Jobs wird in der Statusspalte angezeigt. Der Status Erfolgreich zeigt an, dass der Job abgeschlossen ist.
Optional: Wenn Sie die Jobgrafik und Details zu den Schritten sehen möchten, klicken Sie auf den Jobnamen, z. B.
etl-into-bigquery-bqetlsimple
.Rufen Sie in der Cloud Console die Seite BigQuery auf.
Achten Sie darauf, dass Ihr Google Cloud-Projekt ausgewählt ist.
Geben Sie im Bereich Abfrageeditor zum Ausführen einer Abfrage in der neuen Tabelle Folgendes ein:
SELECT artist_name, artist_gender, artist_area, recording_name, recording_length FROM musicbrainz.recordings_by_artists_dataflow WHERE artist_area is NOT NULL AND artist_gender IS NOT NULL LIMIT 1000;
Daten bereinigen
Als Nächstes nehmen Sie eine kleine Änderung an der Dataflow-Pipeline vor, sodass Sie Suchtabellen laden und diese als Nebeneingaben verarbeiten können. Dies ist im folgenden Diagramm zu sehen:
Wenn Sie die resultierende BigQuery-Tabelle abfragen, ist es schwierig zu erahnen, woher der Interpret stammt, ohne manuell nachzusehen, wofür die numerische Gebiets-ID aus der area
-Tabelle in der MusicBrainz-Datenbank steht. Dies macht die Analyse von Abfrageergebnissen schwieriger als nötig.
Ebenso wird auch das Geschlecht des Interpreten als ID angezeigt. Die gesamte MusicBrainz-Tabelle zum Geschlecht besteht jedoch nur aus drei Zeilen. Sie können dies beheben, indem Sie einen Schritt zur Dataflow-Pipeline hinzufügen, um die IDs mithilfe der area
- und gender
-Tabellen von MusicBrainz ihren entsprechenden Labels zuzuordnen.
Sowohl die Tabelle artist_area
als auch die Tabelle artist_gender
enthalten eine erheblich geringere Anzahl von Zeilen als die Tabellen für Interpreten und für Aufnahmedaten. Die Anzahl unterschiedlicher Elemente in den erstgenannten Tabellen ist durch die Anzahl der geografischen Gebiete bzw. der Geschlechter eingeschränkt.
Infolgedessen wird beim Suchschritt das Dataflow-Feature Nebeneingabe verwendet.
Nebeneingaben werden als Tabellenexporte im durch Zeilen getrennten JSON-Format geladen und zum Denormalisieren der Tabellendaten in nur einem Schritt verwendet.
Code zum Hinzufügen von Nebeneingaben zur Pipeline
Gehen Sie vor dem Ausführen der Pipeline den Code durch, um die neuen Schritte besser nachvollziehen zu können.
Sehen Sie sich in der Datei BQETLSimple.java
die auskommentierten Zeilen an. Für diese werden die Kommentarzeichen in einem folgenden Schritt entfernt.
Dieser Code zeigt die Datenbereinigung bei Nebeneingaben. Die Klasse MusicBrainzTransforms
ist für die Nutzung von Nebeneingaben besser geeignet, um Fremdschlüsselwerte den Labels zuzuordnen. Die Bibliothek MusicBrainzTransforms
bietet eine Methode zum Erstellen einer internen Suchklasse. Die Suchklasse beschreibt sämtliche Suchtabellen und die Felder, die durch Labels ersetzt werden, sowie Argumente variabler Länge. keyKey
ist die Bezeichnung für die Spalte, die den Schlüssel für die Suche enthält, und valueKey
ist der Name der Spalte, die das entsprechende Label enthält.
Alle Nebeneingaben werden als einzelne Zuordnungsobjekte geladen, die für die Suche nach dem entsprechenden Label für eine ID verwendet werden.
Zuerst werden die JSON-Daten für die Suchtabelle mit einem leeren Namespace in MusicBrainzDataObjects
geladen und in eine Zuordnung vom Key
-Spaltenwert zum Value
-Spaltenwert konvertiert.
Jedes dieser Map
-Objekte wird entsprechend dem Wert seines destinationKey
in eine Map
verschoben, wobei es sich um den Schlüssel für die Ersetzung durch den Suchwert handelt.
Dann wird der Wert für destinationKey
(der mit einer Zahl beginnt) während der Transformation der Interpretenobjekte aus JSON durch das entsprechende Label ersetzt.
Damit die Datei BQETLSimple.java
so geändert wird, dass die Daten der Felder artist_area
und artist_gender
mithilfe von Suchvorgängen decodiert werden, führen Sie die folgenden Schritte durch:
Ändern Sie den Programmablauf geringfügig:
- Entfernen Sie die Kommentarzeichen aus den Zeilen, die die Interpretendaten mithilfe der Suchen laden.
- Kommentieren Sie den Aufruf von
loadTable
aus, durch den Interpretendaten ohne Suchen geladen werden.
Ändern Sie
TableFieldSchemas
fürartist_area
undartist_gender
in den Datentypstring
anstelle vonint
. Kommentieren Sie dazu die entsprechendenint
-Felder aus und entfernen Sie die Kommentarzeichen aus den jeweiligenstring
-Feldern.Führen Sie die folgenden Schritte aus, um den Pipelinecode noch einmal auszuführen:
Legen Sie die Umgebungsvariablen für Ihr Projekt fest:
export PROJECT_ID=[PROJECT_ID] export ZONE=[CHOOSE_AN_APPROPRIATE_ZONE]
Prüfen Sie, ob die Umgebung eingerichtet ist:
export DESTINATION_TABLE=recordings_by_artists_dataflow_sideinputs export STAGING_BUCKET=${PROJECT_ID}-etl-staging-bucket export DATASET=musicbrainz export SERVICE_ACCOUNT=project-owner
Legen Sie die Umgebungsvariable GOOGLE_APPLICATION_CREDENTIALS auf den Pfad der JSON-Datei fest, die Ihren Dienstkontoschlüssel enthält.
export GOOGLE_APPLICATION_CREDENTIALS=~/${PROJECT_ID}-${SERVICE_ACCOUNT}.json
Führen Sie die Pipeline aus, um Aufnahmezeilen innerhalb von Interpretenzeilen zu verschachteln:
./run.sh simple
Wiederholen Sie dann die Abfrage, die
artist_area
undartist_gender
umfasst:SELECT artist_name, artist_gender, artist_area, recording_name, recording_length FROM musicbrainz.recordings_by_artists_dataflow_sideinputs WHERE artist_area IS NOT NULL AND artist_gender IS NOT NULL LIMIT 1000;
In der Ausgabe werden
artist_area
undartist_gender
nun decodiert:
BigQuery-Schema optimieren
Im letzten Teil dieser Anleitung führen Sie eine Pipeline aus, die mithilfe verschachtelter Felder ein besser geeignetes Tabellenschema generiert.
Nehmen Sie sich einen Moment Zeit, um sich den Code anzusehen, mit dem diese optimierte Version der Tabelle generiert wird.
Das folgende Diagramm zeigt eine leicht veränderte Dataflow-Pipeline, die die Aufnahmen des Interpreten in jeder Interpretenzeile verschachtelt, anstatt doppelte Interpretenzeilen zu erstellen.
Die Daten werden aktuell ziemlich vereinfacht dargestellt. Das heißt, dass die Darstellung eine Zeile pro zugeordneter Aufnahme umfasst, die alle Interpretenmetadaten aus dem BigQuery-Schema und alle Aufnahmen- sowie artist_credit_name
-Metadaten enthält. Diese vereinfachte Darstellung hat mindestens zwei Nachteile:
- Sie wiederholt die
artist
-Metadaten für jede Aufnahme, die einem Interpret zugeordnet ist, wodurch wiederum mehr Speicher benötigt wird. - Wenn Sie die Daten als JSON exportieren, wird ein Array exportiert, das diese Daten anstelle des Interpreten mit den verschachtelten Aufnahmedaten wiederholt – was vermutlich das ist, was Sie möchten.
Ohne Leistungseinbußen und ohne die Nutzung zusätzlichen Speichers können Sie, statt eine Aufnahme pro Zeile zu speichern, Aufnahmen als wiederkehrendes Feld im Interpreteneintrag speichern, indem Sie ein paar Änderungen an der Dataflow-Pipeline vornehmen.
Statt die Aufnahmen mit den Interpreteninformationen über artist_credit_name.artist
zusammenzuführen, erstellt diese alternative Pipeline eine verschachtelte Liste mit Aufnahmen innerhalb eines Interpretenobjekts.
TableRow
hat Größeneinschränkungen in der BigQuery API. Dadurch beschränkt der Code die Anzahl verschachtelter Aufnahmen für eine bestimmte Aufnahme auf 1.000 Elemente. Wenn ein bestimmter Interpret mehr als 1.000 Aufnahmen hat, dupliziert der Code die Zeile, einschließlich der artist
-Metadaten, und fährt mit der Verschachtelung der Aufnahmedaten in der duplizierten Zeile fort.
Das folgende Diagramm zeigt die Quellen, Transformationen und Senken der Pipeline:
In den meisten Fällen werden die Schrittnamen im Code als Teil des apply
-Methodenaufrufs angegeben.
Führen Sie die folgenden Schritte aus, um die optimierte Pipeline zu erstellen:
Prüfen Sie in Cloud Shell, ob die Umgebung für das Pipelineskript eingerichtet ist:
export PROJECT_ID=[PROJECT_ID] export ZONE=[CHOOSE_AN_APPROPRIATE_ZONE] export DESTINATION_TABLE=recordings_by_artists_dataflow_nested export DATASET=musicbrainz export STAGING_BUCKET=${PROJECT_ID}-etl-staging-bucket export SERVICE_ACCOUNT=project-owner
Legen Sie die Umgebungsvariable
GOOGLE_APPLICATION_CREDENTIALS
auf den Pfad der JSON-Datei fest, die Ihren Dienstkontoschlüssel enthält:export GOOGLE_APPLICATION_CREDENTIALS=~/${PROJECT_ID}-${SERVICE_ACCOUNT}.json
Führen Sie die Pipeline aus, um Aufnahmezeilen innerhalb von Interpretenzeilen zu verschachteln:
./run.sh nested
Fragen Sie Felder aus der verschachtelten Tabelle in BigQuery ab:
SELECT artist_name, artist_gender, artist_area, artist_recordings FROM musicbrainz.recordings_by_artists_dataflow_nested WHERE artist_area IS NOT NULL AND artist_gender IS NOT NULL LIMIT 1000;
Führen Sie eine Abfrage aus, um Werte aus dem
STRUCT
zu extrahieren und zum Filtern der Ergebnisse zu verwenden:SELECT artist_name, artist_gender, artist_area, ARRAY(SELECT artist_credit_name_name FROM UNNEST(recordings_by_artists_dataflow_nested.artist_recordings)) AS artist_credit_name_name, ARRAY(SELECT recording_name FROM UNNEST(recordings_by_artists_dataflow_nested.artist_recordings)) AS recording_name FROM musicbrainz.recordings_by_artists_dataflow_nested, UNNEST(recordings_by_artists_dataflow_nested.artist_recordings) AS artist_recordings_struct WHERE artist_recordings_struct.recording_name LIKE "%Justin%" LIMIT 1000;
Bereinigen
Damit Ihrem Google Cloud-Konto die in dieser Anleitung verwendeten Ressourcen nicht in Rechnung gestellt werden, löschen Sie entweder das Projekt, das die Ressourcen enthält, oder Sie behalten das Projekt und löschen die einzelnen Ressourcen.
Projekt löschen
- Wechseln Sie in der Cloud Console zur Seite Ressourcen verwalten.
- Wählen Sie in der Projektliste das Projekt aus, das Sie löschen möchten, und klicken Sie dann auf Löschen.
- Geben Sie im Dialogfeld die Projekt-ID ein und klicken Sie auf Shut down (Beenden), um das Projekt zu löschen.
Einzelne Ressourcen löschen
Gehen Sie wie unten beschrieben vor, um einzelne Ressourcen statt des ganzen Projekts zu löschen.
Cloud Storage-Bucket löschen
- Wechseln Sie in der Cloud Console zur Seite Cloud Storage-Browser.
- Klicken Sie auf das Kästchen neben dem Bucket, der gelöscht werden soll.
- Klicken Sie zum Löschen des Buckets auf Löschen delete.
BigQuery-Datasets löschen
Öffnen Sie die BigQuery-Web-UI.
Wählen Sie die BigQuery-Datasets aus, die Sie in der Anleitung erstellt haben.
Klicken Sie auf Löschendelete.
Nächste Schritte
- Mehr über das Schreiben von Abfragen für BigQuery erfahren. Im Artikel Interaktive und Batch-Abfragejobs ausführen wird unter anderem erläutert, wie synchrone und asynchrone Abfragen ausgeführt und benutzerdefinierte Funktionen (User Defined Functions, UDFs) erstellt werden.
- BigQuery-Syntax erkunden. BigQuery nutzt eine SQL-ähnliche Syntax, die in der Abfragereferenz (Legacy-SQL) beschrieben wird.
- Mehr über die Konzepte erfahren: BigQuery für Data-Warehouse-Experten.
- Weitere Google Cloud-Features mit unseren Anleitungen testen