无法在任何 public maven 存储库中找到 Databricks spark sql avro 阴影罐
Unable to find Databricks spark sql avro shaded jars in any public maven repository
我们正在尝试使用融合模式注册表创建 avro 记录。我们要发布到 kafka 集群的相同记录。
要将架构 ID 附加到我们需要使用的每条记录(魔法字节)--
to_avro(Column data, Column subject, String schemaRegistryAddress)
为了自动执行此操作,我们需要在管道中构建项目并配置数据块作业以使用该 jar。
现在我们在笔记本中面临的问题,我们能够找到一个带有 3 个参数的方法。
但是当我们在从 https://mvnrepository.com/artifact/org.apache.spark/spark-avro_2.12/3.1.2 下载的构建中使用同一个库时,它只有 to_avro
的 2 个重载方法
databricks 是否有一些其他的 maven 存储库用于它的阴影罐?
笔记本输出
import org.apache.spark.sql.avro.functions
println(functions.getClass().getProtectionDomain().getCodeSource().getLocation())
// file:/databricks/jars/----workspace_spark_3_1--vendor--avro--avro_2.12_deploy_shaded.jar
functions
.getClass()
.getMethods()
.filter(p=>p.getName.equals("to_avro"))
.foreach(f=>println(f.getName, f.getParameters.mkString("Array(", ", ", ")")))
// (to_avro,Array(final org.apache.spark.sql.Column data, final org.apache.spark.sql.Column subject, final java.lang.String schemaRegistryAddress, final java.lang.String jsonFormatSchema))
// (to_avro,Array(final org.apache.spark.sql.Column data, final org.apache.spark.sql.Column subject, final java.lang.String schemaRegistryAddress))
// (to_avro,Array(final org.apache.spark.sql.Column data, final java.lang.String jsonFormatSchema))
// (to_avro,Array(final org.apache.spark.sql.Column data))
本地输出
import org.apache.spark.sql.avro.functions
println(functions.getClass().getProtectionDomain().getCodeSource().getLocation())
// file:/<home-dir-path>/.gradle/caches/modules-2/files-2.1/org.apache.spark/spark-avro_2.12/3.1.2/1160ae134351328a0ed6a062183faf9a0d5b46ea/spark-avro_2.12-3.1.2.jar
functions
.getClass()
.getMethods()
.filter(p=>p.getName.equals("to_avro"))
.foreach(f=>println(f.getName, f.getParameters.mkString("Array(", ", ", ")")))
// (to_avro,Array(final org.apache.spark.sql.Column data, final java.lang.String jsonFormatSchema))
// (to_avro,Array(final org.apache.spark.sql.Column data))
版本
Databricks => 9.1 LTS
Apache Spark => 3.1.2
Scala => 2.12
从数据块支持更新
很遗憾,我们没有支持 DBR 功能的可共享 jar。有一个功能请求将其包含在 DBConnect 中;但是它没有实现,因为我们没有足够的支持来实现该功能。
由于您的用例是自动创建 Jar 文件,然后将其作为作业提交到 Databricks 中,我们应该能够创建一个 jar 存根 (dbr-avro-dummy.jar
),其中包含 to_avro()
具有三个参数的函数,并使用此 jar 作为依赖项来欺骗实际 Jar 的编译器(用于作业)。
这将避免在构建 Jar 时和 运行 时出现编译错误,因为它在 Databricks 环境中 运行,它将从 DBR
您可以使用下面的包代码构建虚拟 Jar 存根:(您将使用 maven/sbt spark/scala 列函数的依赖项)
package org.apache.spark.sql
import java.net.URL
package object avro {
def from_avro(data: Column, key: String, schemaRegistryURL: URL): Column = {
new Column("dummy")
}
}
不,这些 jar 没有发布到任何 public 存储库。您可以检查 databricks-connect
是否提供了这些罐子(您可以通过 databricks-connect get-jar-dir
获取它们的位置),但我对此表示怀疑。
另一种方法是模拟它,例如,创建一个小库,声明一个具有特定签名的函数,并将其仅用于编译,不要包含到生成的 jar 中。
我们正在尝试使用融合模式注册表创建 avro 记录。我们要发布到 kafka 集群的相同记录。
要将架构 ID 附加到我们需要使用的每条记录(魔法字节)--
to_avro(Column data, Column subject, String schemaRegistryAddress)
为了自动执行此操作,我们需要在管道中构建项目并配置数据块作业以使用该 jar。
现在我们在笔记本中面临的问题,我们能够找到一个带有 3 个参数的方法。
但是当我们在从 https://mvnrepository.com/artifact/org.apache.spark/spark-avro_2.12/3.1.2 下载的构建中使用同一个库时,它只有 to_avro
databricks 是否有一些其他的 maven 存储库用于它的阴影罐?
笔记本输出
import org.apache.spark.sql.avro.functions
println(functions.getClass().getProtectionDomain().getCodeSource().getLocation())
// file:/databricks/jars/----workspace_spark_3_1--vendor--avro--avro_2.12_deploy_shaded.jar
functions
.getClass()
.getMethods()
.filter(p=>p.getName.equals("to_avro"))
.foreach(f=>println(f.getName, f.getParameters.mkString("Array(", ", ", ")")))
// (to_avro,Array(final org.apache.spark.sql.Column data, final org.apache.spark.sql.Column subject, final java.lang.String schemaRegistryAddress, final java.lang.String jsonFormatSchema))
// (to_avro,Array(final org.apache.spark.sql.Column data, final org.apache.spark.sql.Column subject, final java.lang.String schemaRegistryAddress))
// (to_avro,Array(final org.apache.spark.sql.Column data, final java.lang.String jsonFormatSchema))
// (to_avro,Array(final org.apache.spark.sql.Column data))
本地输出
import org.apache.spark.sql.avro.functions
println(functions.getClass().getProtectionDomain().getCodeSource().getLocation())
// file:/<home-dir-path>/.gradle/caches/modules-2/files-2.1/org.apache.spark/spark-avro_2.12/3.1.2/1160ae134351328a0ed6a062183faf9a0d5b46ea/spark-avro_2.12-3.1.2.jar
functions
.getClass()
.getMethods()
.filter(p=>p.getName.equals("to_avro"))
.foreach(f=>println(f.getName, f.getParameters.mkString("Array(", ", ", ")")))
// (to_avro,Array(final org.apache.spark.sql.Column data, final java.lang.String jsonFormatSchema))
// (to_avro,Array(final org.apache.spark.sql.Column data))
版本
Databricks => 9.1 LTS
Apache Spark => 3.1.2
Scala => 2.12
从数据块支持更新
很遗憾,我们没有支持 DBR 功能的可共享 jar。有一个功能请求将其包含在 DBConnect 中;但是它没有实现,因为我们没有足够的支持来实现该功能。
由于您的用例是自动创建 Jar 文件,然后将其作为作业提交到 Databricks 中,我们应该能够创建一个 jar 存根 (dbr-avro-dummy.jar
),其中包含 to_avro()
具有三个参数的函数,并使用此 jar 作为依赖项来欺骗实际 Jar 的编译器(用于作业)。
这将避免在构建 Jar 时和 运行 时出现编译错误,因为它在 Databricks 环境中 运行,它将从 DBR
您可以使用下面的包代码构建虚拟 Jar 存根:(您将使用 maven/sbt spark/scala 列函数的依赖项)
package org.apache.spark.sql
import java.net.URL
package object avro {
def from_avro(data: Column, key: String, schemaRegistryURL: URL): Column = {
new Column("dummy")
}
}
不,这些 jar 没有发布到任何 public 存储库。您可以检查 databricks-connect
是否提供了这些罐子(您可以通过 databricks-connect get-jar-dir
获取它们的位置),但我对此表示怀疑。
另一种方法是模拟它,例如,创建一个小库,声明一个具有特定签名的函数,并将其仅用于编译,不要包含到生成的 jar 中。