java - 如何使用 Eclipse 和 Java 从 Google BigQuery 接收数据?

标签 java eclipse google-app-engine google-bigquery

我正在尝试从 google BigQuery 接收一些数据并在我的 eclipse 控制台中显示结果以开始使用 BigQuery 和 Java。基本上,我按照我在这里找到的谷歌提供的说明进行操作: 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 application-default login”。虽然我可以在 SDK 中登录,但 eclipse 给了我之前显示的错误。

然后我尝试了一些其他的方法,比如将我的 token 下载为 Json 文件并在我的应用程序中使用 Java 恢复它,或者手动设置我的环境变量,但效果不佳。

有人知道我做错了什么吗?任何帮助表示赞赏。

最佳答案

听起来您正在点击 a bug in the App Engine SDK这会阻止服务使用 gcloud 应用程序默认凭证。有 a workaround :重命名(或删除)google-cloud-sdk/platform/google_appengine/google/appengine/tools/java/lib/shared/appengine-remote-api.jar

您还需要配置 GCP 项目以用于存储和访问 BigQuery 数据集。可以通过在启动配置的Arguments 选项卡中设置 com.google.appengine.application.id 系统属性来配置此项目(通过 Run > Run Configurations,然后将 -Dcom.google.appengine.application.id=projectID 添加到 Arguments > VM Arguments 部分)。但是,如果您正在访问来自不同项目的数据集(例如,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>

(或任何更新版本)

也就是说,Cloud Tools for Eclipse 应该可以更轻松地指定默认应用程序凭据和项目,所以我提交了 ticket to improve this situation .

关于java - 如何使用 Eclipse 和 Java 从 Google BigQuery 接收数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45824371/

相关文章:

java - 绕过 Java/GWT 中的类型删除

java - 如何在 MockMvc 测试期间使用正确的 Spring Security 配置

java - 向类中添加未实现的方法时,是否可以在 Eclipse IDE 中为该方法自动导入注释?

java - 无法导入内置的java类文件(javax.naming.ldap.SortControl)

java - org.eclipse.swt.browser.XULRunnerPath 不影响使用的浏览器

security - Google App Engine 发送和存储密码的好方法

java - 多态性而不是覆盖方法,添加

java - 使用 DI 时如何处理对象的特殊 "constant"实例

django - Google App Engine 和 Django 支持

google-app-engine - 托管 VM 和 App Engine 托管环境的价格是否相同?