简体   繁体   English

无法从 Eclipse 中的本地 App Engine 实例连接到 BigQuery

[英]Unable to Connect to BigQuery from local App Engine instance in Eclipse

I'm new to Google App Engine and I'm trying to run through some of the tutorials to see how this would work for my organization.我是 Google App Engine 的新手,我正在尝试浏览一些教程,以了解这对我的组织有何作用。 We are looking at putting some of our data into BigQuery and converting some of our Web applications to App Engine which would need to access BigQuery data.我们正在考虑将我们的一些数据放入 BigQuery,并将我们的一些 Web 应用程序转换为需要访问 BigQuery 数据的 App Engine。

I am using the java-docs-samples-master code, specifically bigquery/cloud-client/src/main/java/com/example/bigquery/SimpleApp.java我正在使用 java-docs-samples-master 代码,特别是 bigquery/cloud-client/src/main/java/com/example/bigquery/SimpleApp.java

I can run this from the command line using我可以使用从命令行运行它

mvn exec:java -Dexec.mainClass=com.example.bigquery.SimpleAppMain mvn exec:java -Dexec.mainClass=com.example.bigquery.SimpleAppMain

I incorporate the code into App Engine, which I'm running in Eclipse and created a wrapper so I could still run it from the command line.我将代码合并到我在 Eclipse 中运行的 App Engine 中并创建了一个包装器,这样我仍然可以从命令行运行它。 It works when running from the command line but I get an error when I run it from App Engine in Eclipse.它在从命令行运行时有效,但在 Eclipse 中从 App Engine 运行时出现错误。

Is there something I'm missing to configure my local App Engine to connect to Big Query?我在配置本地 App Engine 以连接到 Big Query 时缺少什么吗?

Error:错误:

com.google.cloud.bigquery.BigQueryException: Invalid project ID 'no_app_id'. Project IDs must contain 6-63 lowercase letters, digits, or dashes. IDs must start with a letter and may not end with a dash.
at com.google.cloud.bigquery.spi.v2.HttpBigQueryRpc.translate(HttpBigQueryRpc.java:86)
at com.google.cloud.bigquery.spi.v2.HttpBigQueryRpc.create(HttpBigQueryRpc.java:170)
at com.google.cloud.bigquery.BigQueryImpl$3.call(BigQueryImpl.java:208)
...
Caused by: com.google.api.client.googleapis.json.GoogleJsonResponseException: 400
{ "code" : 400,
  "errors" : [ {
    "domain" : "global",
    "message" : "Invalid project ID 'no_app_id'. Project IDs must contain 6-63 lowercase letters, digits, or dashes. IDs must start with a letter and may not end with a dash.",
    "reason" : "invalid"
  } ],
  "message" : "Invalid project ID 'no_app_id'. Project IDs must contain 6-63 lowercase letters, digits, or dashes. IDs must start with a letter and may not end with a dash."
}

Code:代码:

package com.example.bigquery;

import com.google.cloud.bigquery.BigQuery;
import com.google.cloud.bigquery.BigQueryOptions;
import com.google.cloud.bigquery.FieldValue;
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.QueryResponse;
import com.google.cloud.bigquery.QueryResult;

import java.util.List;
import java.util.UUID;

public class SimpleApp {
  public void runBQ() throws Exception {
    // [START create_client]
    BigQuery bigquery = BigQueryOptions.getDefaultInstance().getService();
    // [END create_client]
    // [START run_query]
    QueryJobConfiguration queryConfig =
        QueryJobConfiguration.newBuilder(
                "SELECT "
                    + "APPROX_TOP_COUNT(corpus, 10) as title, "
                    + "COUNT(*) as unique_words "
                    + "FROM `publicdata.samples.shakespeare`;")
            // Use standard SQL syntax for queries.
            // See: https://cloud.google.com/bigquery/sql-reference/
            .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) {
      // You can also look at queryJob.getStatus().getExecutionErrors() for all
      // errors, not just the latest one.
      throw new RuntimeException(queryJob.getStatus().getError().toString());
    }

    // Get the results.
    QueryResponse response = bigquery.getQueryResults(jobId);
    // [END run_query]

    // [START print_results]
    QueryResult result = response.getResult();

    // Print all pages of the results.
    while (result != null) {
      for (List<FieldValue> row : result.iterateAll()) {
        List<FieldValue> titles = row.get(0).getRepeatedValue();
        System.out.println("titles:");

        for (FieldValue titleValue : titles) {
          List<FieldValue> titleRecord = titleValue.getRecordValue();
          String title = titleRecord.get(0).getStringValue();
          long uniqueWords = titleRecord.get(1).getLongValue();
          System.out.printf("\t%s: %d\n", title, uniqueWords);
        }

        long uniqueWords = row.get(1).getLongValue();
        System.out.printf("total unique words: %d\n", uniqueWords);
      }

      result = result.getNextPage();
    }
    // [END print_results]
  }
}

From the looks of your error code, it's probably due to your project ID not being set: "no_app_id".从您的错误代码的外观来看,可能是由于您的项目 ID 未设置:“no_app_id”。 Here is how to set your project ID for app engine: https://developers.google.com/eclipse/docs/appengine_appid_version .以下是为应用引擎设置项目 ID 的方法: https : //developers.google.com/eclipse/docs/appengine_appid_version

Not sure if I am late, but I encountered such error while working with Firestore and it was due to no project being set on the 'Cloud Platform' tab in App Engine run configuration.不确定我是否迟到了,但我在使用 Firestore 时遇到了这样的错误,这是因为在 App Engine 运行配置的“云平台”选项卡上没有设置项目。 When I logged into an account and selected a project ID, this error went away.当我登录帐户并选择项目 ID 时,此错误消失了。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM