17 - BigQuery SDK in Java¶
Ziel¶
In dieser Übungsaufgabe werden Sie ein Java-CLI-Tool entwickeln, das eine CSV-Datei in eine bereits existierende Google BigQuery-Tabelle lädt. Das Projekt wird als Maven-Projekt aufgebaut.
Es wird vorausgesetzt, dass bereits ein GCP-Projekt vorhanden ist.
Schritt 0: Storage Bucket, Dataset und Tabelle erstellen¶
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 nun einen GCS-Bucket für diese Aufgabe. Sie können einen beliebigen Bucket-Name wählen – Sie brauchen den Namen aber später.
gsutil mb -l EU gs://YOUR_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://YOUR_BUCKET_NAME/spotify.csv
Schritt 1: Projekt-Setup¶
Erstellen Sie ein neues Maven-Projekt.
mvn archetype:generate -DgroupId=com.example -DartifactId=bq-uploader \
-DarchetypeArtifactId=maven-archetype-quickstart \
-DinteractiveMode=false
cd bq-uploader
Schritt 2: Abhängigkeiten hinzufügen¶
Öffnen Sie die pom.xml-Datei und fügen Sie die notwendigen Abhängigkeiten für
Google BigQuery hinzu.
<dependencies>
<dependency>
<groupId>com.google.cloud</groupId>
<artifactId>google-cloud-bigquery</artifactId>
<version>2.40.3</version>
</dependency>
</dependencies>
Schritt 3: Ergänzung des Manifests in pom.xml¶
Um sicherzustellen, dass die Main-Class im Manifest des JAR-Files enthalten
ist, müssen wir das pom.xml-File anpassen.
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.2.0</version>
<configuration>
<archive>
<manifest>
<mainClass>com.example.BqUploader</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>3.3.0</version>
<configuration>
<archive>
<manifest>
<mainClass>com.example.BqUploader</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
Schritt 4: Java-Klasse erstellen¶
Entfernen Sie das src/test-Verzeichnis sowie die Datei App.java im
Verzeichnis src/main/java/com/example.
Erstellen Sie eine neue Java-Klasse BqUploader unter
src/main/java/com/example.
package com.example;
import com.google.cloud.bigquery.BigQuery;
import com.google.cloud.bigquery.BigQueryOptions;
import com.google.cloud.bigquery.FormatOptions;
import com.google.cloud.bigquery.Job;
import com.google.cloud.bigquery.JobInfo;
import com.google.cloud.bigquery.LoadJobConfiguration;
import com.google.cloud.bigquery.TableId;
import com.google.cloud.bigquery.JobId;
import java.util.UUID;
public class BqUploader {
public static void main(String[] args) {
if (args.length < 1) {
System.out.println("Usage: java -jar bq-uploader.jar <gs-file>");
System.exit(1);
}
String gsFile = args[0];
try {
uploadCsvToBigQuery(gsFile);
} catch (Exception e) {
System.err.println(e.getMessage());
}
}
public static void uploadCsvToBigQuery(String gsFile) throws Exception {
BigQuery bigQuery = BigQueryOptions.getDefaultInstance().getService();
TableId tableId = TableId.of( "spotify", "tracks");
LoadJobConfiguration loadConfig = LoadJobConfiguration.newBuilder(
tableId,
gsFile,
FormatOptions.csv().toBuilder().setSkipLeadingRows(1).build())
.build();
Job job = bigQuery.create(
JobInfo.newBuilder(loadConfig)
.setJobId(JobId.of(UUID.randomUUID().toString()))
.build());
job = job.waitFor();
if (job.isDone()) {
System.out.println("CSV file successfully loaded to BigQuery");
} else {
System.out.println(
"BigQuery was unable to load the CSV file: \n"
+ job.getStatus().getError());
}
}
}
Schritt 5: Erstellung des Fat JARs¶
Kompilieren und erstellen Sie das Fat JAR-File.
mvn clean package
Das Fat JAR-File befindet sich im target-Verzeichnis und heißt
bq-uploader-1.0-SNAPSHOT-jar-with-dependencies.jar.
Schritt 6: Ausführung des Tools¶
Führen Sie das Tool aus, indem Sie das Fat JAR-File ausführen und die CSV-Datei sowie die Projekt- und Tabellendetails als Argumente übergeben. Der Pfad zur Datei muss eine Google Cloud Storage-URI sein.
java -jar target/bq-uploader-1.0-SNAPSHOT-jar-with-dependencies.jar \
gs://YOUR_BUCKET_NAME/spotify.csv
Schritt 7: SQL-Abfrage 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'