使用Databricks Connect时如何在Scala中正确访问dbutils

emz*_*ero 6 scala databricks azure-databricks databricks-connect dbutils

我正在使用Databricks Connect从IntelliJ IDEA(Scala)在本地Azure Databricks群集中运行代码。

一切正常。我可以在IDE中本地连接,调试和检查。

我创建了一个Databricks作业来运行我的自定义应用程序JAR,但由于以下异常而失败:

19/08/17 19:20:26 ERROR Uncaught throwable from user code: java.lang.NoClassDefFoundError: com/databricks/service/DBUtils$
at Main$.<init>(Main.scala:30)
at Main$.<clinit>(Main.scala)
Run Code Online (Sandbox Code Playgroud)

我的Main.scala类的第30行是

val dbutils: DBUtils.type = com.databricks.service.DBUtils
Run Code Online (Sandbox Code Playgroud)

就像本文档页面上的描述一样

该页面显示了一种访问在本地和群集中均可使用的DBUtil的方法。但是该示例仅显示了Python,而我正在使用Scala。

以既可以使用databricks-connect在本地工作又可以在运行JAR的Databricks作业中工作的方式访问它的正确方法是什么?

更新

似乎有两种使用DBUtils的方法。

1)这里描述的DbUtils类。引用文档,此库允许您构建和编译项目,但不能运行它。这不允许您在集群上运行本地代码。

2)此处描述 Databricks Connect 。这使您可以在Databricks集群中运行本地Spark代码。

问题在于这两种方法具有不同的设置和程序包名称。似乎没有一种在本地使用Databricks Connect的方法(在群集中不可用),但是随后通过sbt / maven添加了使用DbUtils类的jar应用程序,以便群集可以访问它。

VBe*_*Bel 7

我不知道为什么你提到的文档不起作用。也许您正在使用不同的依赖项?

这些文档有一个示例应用程序,您可以下载。这是一个测试非常少的项目,因此它不会创建作业或尝试在集群上运行它们——但这只是一个开始。另请注意,它使用旧0.0.1版本的dbutils-api.

因此,要解决您当前的问题,请尝试从其他位置com.databricks.service.DBUtils导入,而不是使用:dbutils

import com.databricks.dbutils_v1.DBUtilsHolder.dbutils
Run Code Online (Sandbox Code Playgroud)

或者,如果您愿意:

import com.databricks.dbutils_v1.{DBUtilsV1, DBUtilsHolder}

type DBUtils = DBUtilsV1
val dbutils: DBUtils = DBUtilsHolder.dbutils
Run Code Online (Sandbox Code Playgroud)

另外,请确保您在 SBT 中具有以下依赖项(如果0.0.3不起作用,也许可以尝试使用版本 - 最新的版本是0.0.4):

libraryDependencies += "com.databricks" % "dbutils-api_2.11" % "0.0.3"
Run Code Online (Sandbox Code Playgroud)

这个问题和答案为我指明了正确的方向。答案包含一个使用 waimak 的工作 Github 存储库dbutils链接。我希望这个存储库可以帮助您解决有关 Databricks 配置和依赖项的进一步问题。

祝你好运!


更新

我明白了,所以我们有两个相似但不相同的 API,并且没有在本地版本和后端版本之间切换的好方法(尽管 Databricks Connect 承诺它应该可以工作)。请让我提出一个解决方法。

Scala 编写适配器很方便,这很好。下面是一个应该充当桥梁的代码片段——DBUtils这里定义了一个对象,它为两个版本的 API 提供了足够的 API 抽象:Databricks Connect oncom.databricks.service.DBUtils和后端com.databricks.dbutils_v1.DBUtilsHolder.dbutilsAPI。我们可以通过加载并随后使用com.databricks.service.DBUtils反射来实现这一点——我们没有对其进行硬编码导入。

import com.databricks.dbutils_v1.DBUtilsHolder.dbutils
Run Code Online (Sandbox Code Playgroud)

val dbutils: DBUtils.type = com.databricks.service.DBUtils如果您将您在Main中提到的替换为val dbutils: DBUtils.type = com.example.my.proxy.adapter.DBUtils,则所有内容都应该作为直接替换,无论是本地还是远程。

如果您有一些新的NoClassDefFoundError依赖项,请尝试向 JAR 作业添加特定的依赖项,或者尝试重新排列它们、更改版本或将依赖项标记为提供的依赖项。

这个适配器并不漂亮,并且它使用反射,但我希望它作为一种解决方法应该足够好。祝你好运 :)


CHE*_*SFT -1

要访问 dbutils.fs 和 dbutils.secrets Databricks 实用程序,请使用 DBUtils 模块。

示例:在 scala 编程中访问 DBUtils 如下所示:

val dbutils = com.databricks.service.DBUtils
println(dbutils.fs.ls("dbfs:/"))
println(dbutils.secrets.listScopes())
Run Code Online (Sandbox Code Playgroud)

参考: Databricks - 访问 DBUtils

希望这可以帮助。