![](/img/trans.png)
[英]how to batch insert data into Google BigQuery from a Java service?
[英]How can I receive Data from Google BigQuery with Eclipse and Java?
我正尝试从Google BigQuery接收一些数据,并在Eclipse控制台中显示结果以开始使用BigQuery和Java。 基本上,我遵循了google提供的说明,该说明位于以下位置: https : //cloud.google.com/bigquery/docs/reference/libraries
因此,我的示例Java代码看起来像Google的快速入门示例:
import com.google.cloud.bigquery.BigQuery;
import com.google.cloud.bigquery.BigQueryOptions;
import com.google.cloud.bigquery.Dataset;
import com.google.cloud.bigquery.DatasetInfo;
public class QuickstartSample {
public static void main(String... args){
// Instantiates a client
BigQuery bigquery = BigQueryOptions.getDefaultInstance().getService();
// The name for the new dataset
String datasetName = "bigquery-public-data:hacker_news.comments";
// Prepares a new dataset
Dataset dataset = null;
DatasetInfo datasetInfo = DatasetInfo.newBuilder(datasetName).build();
// Creates the dataset
dataset = bigquery.create(datasetInfo);
System.out.printf("Dataset %s created.%n", dataset.getDatasetId().getDataset());
}
}
但是,当我运行此代码时,出现以下错误:
HTTP ERROR 500
Problem accessing /getbigquery. Reason:
Could not get the access token.
Caused by:
com.google.cloud.bigquery.BigQueryException: Could not get the access token.
at com.google.cloud.bigquery.spi.v2.HttpBigQueryRpc.translate(HttpBigQueryRpc.java:86)
at com.google.cloud.bigquery.spi.v2.HttpBigQueryRpc.create(HttpBigQueryRpc.java:141)
at com.google.cloud.bigquery.BigQueryImpl$1.call(BigQueryImpl.java:172)
at com.google.cloud.bigquery.BigQueryImpl$1.call(BigQueryImpl.java:169)
at com.google.api.gax.retrying.DirectRetryingExecutor.submit(DirectRetryingExecutor.java:94)
at com.google.cloud.RetryHelper.runWithRetries(RetryHelper.java:54)
at com.google.cloud.bigquery.BigQueryImpl.create(BigQueryImpl.java:169)
at testpackage.dto.QuickstartSample.main(QuickstartSample.java:27)
at testpackage.getbigquery.doPost(getbigquery.java:27)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1166)
at com.google.appengine.api.socket.dev.DevSocketFilter.doFilter(DevSocketFilter.java:74)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at com.google.appengine.tools.development.ResponseRewriterFilter.doFilter(ResponseRewriterFilter.java:134)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at com.google.appengine.tools.development.HeaderVerificationFilter.doFilter(HeaderVerificationFilter.java:34)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at com.google.appengine.api.blobstore.dev.ServeBlobFilter.doFilter(ServeBlobFilter.java:63)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:48)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at com.google.appengine.tools.development.StaticFileFilter.doFilter(StaticFileFilter.java:122)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
我尝试使用默认凭据进行身份验证,因此我在Google SDK控制台中运行了“ gcloud auth应用程序默认登录名”。 尽管我可以登录SDK,但是eclipse给了我先前显示的错误。
然后,我尝试了其他一些操作,例如将令牌下载为Json文件,并在应用程序中使用Java对其进行了验证,或者手动设置了环境变量,但效果不佳。
有人知道我在做什么错吗? 任何帮助表示赞赏。
听起来您好像遇到了App Engine SDK中的错误,该错误阻止了服务使用gcloud
应用程序默认凭据 。 有一种解决方法 :重命名(或删除) google-cloud-sdk/platform/google_appengine/google/appengine/tools/java/lib/shared/appengine-remote-api.jar
。
您还需要配置GCP项目,以用于存储和访问BigQuery数据集。 可以通过在启动配置的“ 参数”标签中设置com.google.appengine.application.id
系统属性来配置此项目(通过“运行”>“运行配置” ,然后将-Dcom.google.appengine.application.id=projectID
添加到“ 参数”> VM参数部分)。 但是,如果您要访问其他项目中bigquery-public-data
集(例如, bigquery-public-data
集),则需要显式配置BigQuery
构建器,如下所示:
BigQueryOptions.newBuilder()
.setProjectId("projectID")
.build().getService();
最后,还必须通过将以下内容添加到pom.xml
来包括appengine-api-1.0-sdk
依赖项:
<dependency>
<groupId>com.google.appengine</groupId>
<artifactId>appengine-api-1.0-sdk</artifactId>
<version>1.9.50</version>
</dependency>
(或任何更高版本)
就是说, 用于Eclipse的Cloud Tools应该使指定默认的应用程序凭证和项目变得更加容易,因此我提交了一张票证来改善这种情况 。
以下内容应添加到您的maven项目的pom.xml中
<!--Google Bigquery-->
<dependency>
<groupId>com.google.cloud</groupId>
<artifactId>google-cloud-bigquery</artifactId>
<version>0.8.0-beta</version>
</dependency>
在具有必要权限的情况下,在Google Cloud Platform控制台-> IAM->服务帐户中创建服务帐户。 您将被允许下载JSON密钥文件。
import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
import com.google.api.client.http.javanet.NetHttpTransport;
import com.google.api.client.json.jackson2.JacksonFactory;
import com.google.api.client.util.Data;
import com.google.api.services.bigquery.model.*;
import com.google.api.services.bigquery.Bigquery;
import com.google.api.services.bigquery.BigqueryScopes;
import java.io.ByteArrayInputStream;
//Read the content of the service account key file in following variable. Please take appropriate security measures into the account.
String credentials = "Content of JSON secret file";
//Create bigquery client
NetHttpTransport transport = new NetHttpTransport();
JacksonFactory jsonFactory = new JacksonFactory();
GoogleCredential credential = GoogleCredential.fromStream(new ByteArrayInputStream(credentials.getBytes()));
if (credential.createScopedRequired) credential = credential.createScoped(BigqueryScopes.all);
Bigquery bigqueryClient = new Bigquery.Builder(transport, jsonFactory, credential).setApplicationName("Your Application Name").build();
String projectId = "Your-project-id";
String datasetId = "NewDatasetName";
Dataset dataset = new Dataset();
DatasetReference datasetRef = new DatasetReference();
datasetRef.setProjectId(projectId);
datasetRef.setDatasetId(datasetId);
dataset.setDatasetReference(datasetRef);
try {
bigqueryClient.datasets().insert(projectId, dataset).execute();
} catch (Exception e){
//Handle exceptions
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.