我正在使用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
。
这对我来说似乎是个错误。有没有办法通过显式设置默认项目来解决这个问题?
答案 0 :(得分:1)
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 init
或gcloud config set project
设置的gcloud默认项目。
根据我的测试,BigQuery不使用创建服务帐户的项目。我认为密钥仅用于授权,您始终必须设置目标项目。有很多方法:
.setProjectId(<target-project>)
在构建器GOOGLE_CLOUD_PROJECT
gcloud config set project <target-project>
然后将在target-project
中创建查询作业。当然,您的服务密钥应该可以访问target-project
,这可能与创建密钥的项目相同,也可能不同。也就是说,只要您的密钥有权这样做,您就可以对创建密钥的项目以外的项目运行查询。