以编程方式为BigQuery Service传递服务帐户凭据(JSON文件)

时间:2017-07-21 20:44:55

标签: google-bigquery google-cloud-platform google-cloud-storage

我正在将BigQuery表格中的数据导出到Google Cloud Storage,我可以使用应用程序默认凭据成功完成此操作。我在GOOGLE_APPLICATION_CREDENTIALS中设置了环境变量bash_profile(此环境变量指向我的服务帐户JSON文件),这就是我能够检索BigQuery Service的方式(我是使用Scala(使用Java API))。

val bigquery: BigQuery = BigQueryOptions.getDefaultInstance().getService()

现在,我试图找到一种方法来检索BigQuery服务,方法是以编程方式传递服务帐户JSON,而不是使用环境变量(即GOOGLE_APPLICATION_CREDENTIALS

val inputStream = this.getClass.getResourceAsStream("/GCCredentials.json")
val credentials = GoogleCredentials.fromStream(inputStream)
val bigquery = BigQueryOptions.newBuilder().setCredentials(credentials).build().getService    

但是这段代码不起作用,我得到以下异常

Exception in thread "main" java.lang.NullPointerException
    at com.google.api.client.repackaged.com.google.common.base.Preconditions.checkNotNull(Preconditions.java:213)
    at com.google.api.client.util.Preconditions.checkNotNull(Preconditions.java:127)

我的代码中缺少什么?

1 个答案:

答案 0 :(得分:1)

TL; DR - 您错过了FileInputStream

更长的版本

试试这个:

val fileInputStream = new FileInputStream("/GCCredentials.json")
var credentials = GoogleCredentials.fromStream(fileInputStream)
val bigquery = BigQueryOptions.newBuilder().setCredentials(credentials).build().getService()

使用FileInputStream读取服务帐户json文件的内容,并将FileInputStream对象传递给GoogleCredentials以构建凭据。

或者(仅用于添加信息),如果您知道json文件的格式是服务帐户凭据格式,则可以使用ServiceAccountCredentials而不是GoogleCredentials

GoogleCredentials是用于读取OAuth2凭据以与任何Google API一起使用的基类,而ServiceAccountCredentials是特定于服务帐户的。使用其中任何一个都适用于您的情况。

指定要使用的项目

您很可能必须指定要使用的项目ID(如果您的环境未提供此信息)。如果您没有明确设置项目ID,库将尝试猜测要使用的项目ID。

您可以使用以下环境变量之一指定项目ID:

  • GOOGLE_CLOUD_PROJECT
  • GCLOUD_PROJECT

如果未指定,则会查看当前活动的gcloud配置以检测要使用的项目。

您也可以在代码中明确设置(如您在评论中所述),如下所示:

val bigquery = BigQueryOptions.newBuilder().setCredentials(credentials).setProjectId("MY_PROJECT_ID").build().getService()