簡體   English   中英

如何使用Eclipse和Java從Google BigQuery接收數據?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM