我正在将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)
我的代码中缺少什么?
答案 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()