为什么 Dataproc 使用 JSON 包的这个奇怪的阴影版本,我该如何使用它?

Why is Dataproc using this weird shaded version of the JSON package and how do I work with it?

我正在尝试从 BigQuery 连接器捕获预期的异常。异常的 class 是: com.google.api.client.googleapis.json.GoogleJsonResponseException 之前我已经成功捕获了这个异常,它是由 Cloud Storage 连接器抛出的。

当我 运行 Dataproc (Spark) 中的代码时,抛出的异常是此异常的类似但阴影版本:com.google.cloud.hadoop.repackaged.bigquery.com.google.api.client.googleapis.json.GoogleJsonResponseException.

我的代码如下所示:

...
  case e: GoogleJsonResponseException =>
    e.getDetails.getCode match {
      case 404 =>
        ss.emptyDataFrame
      case _ =>
        throw e
    }
  case e: Exception =>
    println(e.getClass) // reaches here
    throw e
...

在我的 build.sbt 中(我认为这可能是错误的)我有这个:

assemblyShadeRules in assembly := Seq(
  ShadeRule
    .rename("com.google.common.**" -> "repackaged.com.google.common.@1")
    .inAll
)

我需要这个重新打包的版本来摆脱一些 Google 令人讨厌的不兼容性(可耻 Google、可耻)。

为什么它也对它进行着色?我怎样才能使它工作或解决它?

小警告 我对 Java 的工作不多,对 Scala 的了解就更少了,所以我对 shading/repackaging 知之甚少 - 温柔一点


编辑:根据下面的评论,我应该多说一下确切的方法。

我正在使用 sparkContext.newAPIHadoopRDD 从 BQ 读取数据。堆栈跟踪的顶部如下所示:

at com.google.cloud.hadoop.repackaged.bigquery.com.google.api.client.googleapis.json.GoogleJsonResponseException.from(GoogleJsonResponseException.java:150)
    at com.google.cloud.hadoop.repackaged.bigquery.com.google.api.client.googleapis.services.json.AbstractGoogleJsonClientRequest.newExceptionOnError(AbstractGoogleJsonClientRequest.java:113)
    at com.google.cloud.hadoop.repackaged.bigquery.com.google.api.client.googleapis.services.json.AbstractGoogleJsonClientRequest.newExceptionOnError(AbstractGoogleJsonClientRequest.java:40)
    at com.google.cloud.hadoop.repackaged.bigquery.com.google.api.client.googleapis.services.AbstractGoogleClientRequest.interceptResponse(AbstractGoogleClientRequest.java:401)
    at com.google.cloud.hadoop.repackaged.bigquery.com.google.api.client.http.HttpRequest.execute(HttpRequest.java:1097)
    at com.google.cloud.hadoop.repackaged.bigquery.com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:499)
    at com.google.cloud.hadoop.repackaged.bigquery.com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:432)
    at com.google.cloud.hadoop.repackaged.bigquery.com.google.api.client.googleapis.services.AbstractGoogleClientRequest.execute(AbstractGoogleClientRequest.java:549)
    at com.google.cloud.hadoop.io.bigquery.BigQueryHelper.getTable(BigQueryHelper.java:327)

这显然是因为 BQ 连接器中的错误。感谢 Dagang 和 Igor Dvorzhak,据称,它现在将在即将推出的连接器 1.0.0 版本中得到修复(请参阅问题评论)。

如果您遇到此问题,请等待新版本发布。或者如果已经更新到 >1.0.0.

希望对您有所帮助。