BigQuery Java API中的默认项目ID

时间:2017-06-21 20:52:36

标签: google-bigquery

我正在使用BigQuery Java API执行查询,其代码如下:

  try (FileInputStream input = new FileInputStream(serviceAccountKeyFile)) {

     GoogleCredentials credentials = GoogleCredentials.fromStream(input);

     BigQuery bigQuery = BigQueryOptions.newBuilder()
           .setCredentials(credentials)
           .build()
           .getService();

     QueryRequest request = QueryRequest.of("SELECT * FROM foo.Bar");
     QueryResponse response = bigQuery.query(request);

     // Handle the response ...

  }

请注意,我使用的是特定服务帐户,其密钥文件由serviceAccountKeyFile提供。

我原以为API会从密钥文件中获取project_id。但它实际上是从project_id环境变量引用的默认密钥文件中获取GOOGLE_APPLICATION_CREDENTIALS

这对我来说似乎是个错误。有没有办法通过显式设置默认项目来解决这个问题?

2 个答案:

答案 0 :(得分:1)

是的,这根本听起来不对。它听起来像一个bug。我总是在我们的应用程序中使用导出GOOGLE_APPLICATION_CREDENTIALS环境变量。

无论如何,您尝试显式设置项目ID以查看它是否有效:

BigQuery bigQuery = BigQueryOptions.newBuilder()
                    .setCredentials(credentials)
                    .setProjectId("project-id") //<--try setting it here
                    .build()
                    .getService();

答案 1 :(得分:0)

我不相信该项目来自GOOGLE_APPLICATION_CREDENTIALS。我怀疑正在拾取的项目是由gcloud initgcloud config set project设置的gcloud默认项目。

根据我的测试,BigQuery不使用创建服务帐户的项目。我认为密钥仅用于授权,您始终必须设置目标项目。有很多方法:

  1. .setProjectId(<target-project>)在构建器
  2. 定义GOOGLE_CLOUD_PROJECT
  3. gcloud config set project <target-project>
  4. 然后将在target-project中创建查询作业。当然,您的服务密钥应该可以访问target-project,这可能与创建密钥的项目相同,也可能不同。也就是说,只要您的密钥有权这样做,您就可以对创建密钥的项目以外的项目运行查询。