16 - BigQuery SDK in Node.js¶
In dieser Übungsaufgabe entwickeln Sie ein Node.js-CLI-Tool, das eine CSV-Datei in eine bereits existierende Google BigQuery-Tabelle lädt. Es wird davon ausgegangen, dass bereits ein GCP-Projekt vorhanden ist.
Storage Bucket, Dataset und Tabelle erstellen¶
Stellen Sie sicher, dass Sie die Google Cloud SDK installiert haben und sich authentifiziert haben:
gcloud auth login
gcloud config set project YOUR_PROJECT_ID
Erstellen Sie ein Dataset mit dem Namen spotify:
bq --location=EU mk -d spotify
Erstellen Sie eine Tabelle tracks im Dataset spotify:
bq mk --table spotify.tracks \
id:STRING,name:STRING,genre:STRING,artists:STRING,album:STRING, \
popularity:INTEGER,duration:INTEGER,explicit:STRING
Erstellen Sie einen GCS-Bucket für diese Aufgabe. Sie können einen beliebigen
Bucket-Name wählen – Sie brauchen den Namen aber später.
Das folgende Skript wird einen zufälligen Namen erzeugen und in einer
Shell-Variable namens BUCKET_NAME speichern. Sofern Sie in der gleichen
Shell-Sitzung weiterarbeiten, wird die Variable weiter zur Verfügung stehen.
BUCKET_SUFFIX=$(LC_ALL=C tr -dc 'a-z0-9' </dev/urandom | head -c 10)
export BUCKET_NAME="bucket-${BUCKET_SUFFIX}"
echo "Using bucket name ${BUCKET_NAME}"
gsutil mb -l EU gs://${BUCKET_NAME}
Kopieren Sie die CSV mit Beispieldaten in den neuen Bucket. Die Datei
spotify.csv finden Sie im Material-ZIP unter bigquery/spotify.csv
(Material herunterladen).
gsutil cp spotify.csv gs://${BUCKET_NAME}/spotify.csv
Projekt-Setup¶
Erstellen Sie ein neues Node.js-Projekt:
mkdir bq-uploader
cd bq-uploader
npm init -y
Abhängigkeiten hinzufügen¶
Installieren Sie die Google Cloud BigQuery und Storage SDKs:
npm install --save @google-cloud/bigquery @google-cloud/storage
CLI-Skript erstellen¶
Erstellen Sie eine Datei bqUploader.js im Projektverzeichnis mit folgendem
Inhalt:
const { BigQuery } = require('@google-cloud/bigquery');
const { Storage } = require('@google-cloud/storage');
async function uploadCsvToBigQuery(bucketName, filename) {
const bigQuery = new BigQuery();
const storage = new Storage();
const datasetId = 'spotify';
const tableId = 'tracks';
const metadata = {
sourceFormat: 'CSV',
skipLeadingRows: 1,
};
// Job-Konfiguration für das Hochladen der CSV-Datei
const [job] = await bigQuery
.dataset(datasetId)
.table(tableId)
.load(storage.bucket(bucketName).file(filename), metadata);
console.log(`Job ${job.id} gestartet.`);
// Überprüfen, ob der Job abgeschlossen wurde
const jobStatus = job.status;
if (jobStatus.state === 'DONE') {
console.log('CSV-Datei erfolgreich nach BigQuery geladen.');
} else {
console.error(`Fehler beim Laden der Datei: ${jobStatus.errorResult.message}`);
}
}
if (process.argv.length < 4) {
console.log('Usage: node bqUploader.js <bucket> <filename>');
process.exit(1);
}
const bucket = process.argv[2];
const filename = process.argv[3];
uploadCsvToBigQuery(bucket, filename).catch(console.error);
Ausführung des Tools¶
Führen Sie das Tool aus, indem Sie das Node.js-Skript mit der CSV-Datei als Argument aufrufen:
node bqUploader.js ${BUCKET_NAME} spotify.csv
SQL-Abfragen gegen BigQuery ausführen¶
Führen Sie einige Beispiel-Queries mit dem bq-CLI aus:
bq query 'SELECT * FROM spotify.tracks LIMIT 10'
bq query --format json 'SELECT * FROM spotify.tracks LIMIT 5'
bq query 'SELECT genre, COUNT(genre) FROM spotify.tracks GROUP BY genre'
bq query 'SELECT album, popularity FROM spotify.tracks ORDER BY popularity' \
'DESC LIMIT 20'