Google Cloud Services - BigQuery
This extension allows to inject a com.google.cloud.bigquery.BigQuery
object or a com.google.cloud.bigquery.storage.v1.BigQueryWriteClient
object inside your Quarkus application.
Be sure to have read the Google Cloud Services extension pack global documentation before this one, it contains general configuration and information.
Bootstrapping the project
First, we need a new project. Create a new project with the following command (replace the version placeholder with the correct one):
mvn io.quarkus:quarkus-maven-plugin:${quarkusVersion}:create \
-DprojectGroupId=org.acme \
-DprojectArtifactId=bigquery-quickstart \
-Dextensions="resteasy-reactive-jackson,quarkus-google-cloud-bigquery"
cd bigquery-quickstart
This command generates a Maven project, importing the Google Cloud BigQuery extension.
If you already have your Quarkus project configured, you can add the quarkus-google-cloud-bigquery
extension to your project by running the following command in your project base directory:
./mvnw quarkus:add-extension -Dextensions="quarkus-google-cloud-bigquery"
This will add the following to your pom.xml:
<dependency>
<groupId>io.quarkiverse.googlecloudservices</groupId>
<artifactId>quarkus-google-cloud-bigquery</artifactId>
</dependency>
Some example
This is an example usage of the extension: we create a REST resource with a single endpoint that queries the Stackoverflow public dataset for questions tagged with 'google-bigquery' and returns the results.
import java.util.UUID;
import java.util.stream.Collectors;
import java.util.stream.StreamSupport;
import javax.inject.Inject;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import com.google.cloud.bigquery.BigQuery;
import com.google.cloud.bigquery.Job;
import com.google.cloud.bigquery.JobId;
import com.google.cloud.bigquery.JobInfo;
import com.google.cloud.bigquery.QueryJobConfiguration;
import com.google.cloud.bigquery.TableResult;
@Path("/bigquery")
public class BigQueryResource {
@Inject
BigQuery bigquery; // Inject BigQuery
@GET
@Produces(MediaType.TEXT_PLAIN)
public String bigquery() throws InterruptedException {
QueryJobConfiguration queryConfig = QueryJobConfiguration.newBuilder(// Define a new Job with the query
"SELECT "
+ "CONCAT('https://stackoverflow.com/questions/', CAST(id as STRING)) as url, view_count "
+ "FROM `bigquery-public-data.stackoverflow.posts_questions` "
+ "WHERE tags like '%google-bigquery%' ORDER BY favorite_count DESC LIMIT 10")
.setUseLegacySql(false)
.build();
// Create a job ID so that we can safely retry.
JobId jobId = JobId.of(UUID.randomUUID().toString());
Job queryJob = bigquery.create(JobInfo.newBuilder(queryConfig).setJobId(jobId).build());
// Wait for the query to complete.
queryJob = queryJob.waitFor();
// Check for errors
if (queryJob == null) {
throw new RuntimeException("Job no longer exists");
} else if (queryJob.getStatus().getError() != null) {
throw new RuntimeException(queryJob.getStatus().getError().toString());
}
// Get the results and return them
TableResult result = queryJob.getQueryResults();
return StreamSupport.stream(result.iterateAll().spliterator(), false)
.map(row -> row.get("url").getStringValue() + " - " + row.get("view_count").getLongValue() + "\n")
.collect(Collectors.joining());
}
}
If you want to use the BigQuery Storage Write API you can inject a BigQueryWriteClient
:
import javax.inject.Inject;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import com.google.cloud.bigquery.storage.v1.BigQueryWriteClient;
@Path("/bigquery")
public class BigQueryResource {
@Inject
BigQueryWriteClient bigQueryWriteClient;
@GET
@Produces(MediaType.TEXT_PLAIN)
public String bigquery() {
// do whatever you want with the BigQueryWriteClient ...
}
}