如何使用Scala反射/镜像调用Databricks dbutils

如何使用Scala反射/镜像调用Databricks dbutils,scala,reflection,databricks,scala-reflect,dbutils,Scala,Reflection,Databricks,Scala Reflect,Dbutils,我想打电话 com.databricks.dbutils_v1.DBUtilsHolder.dbutils.secrets.get(scope = "myScope", key = "myKey") 使用镜像 到目前为止,我做到了这一点: val className = "com.databricks.dbutils_v1.DBUtilsHolder" import scala.reflect.runtime.{universe =

我想打电话

com.databricks.dbutils_v1.DBUtilsHolder.dbutils.secrets.get(scope = "myScope", key = "myKey")
使用镜像

到目前为止,我做到了这一点:

val className = "com.databricks.dbutils_v1.DBUtilsHolder"

import scala.reflect.runtime.{universe => ru}
val mirror = ru.runtimeMirror(getClass.getClassLoader)

val moduleSymbol = mirror.staticModule(className)
val moduleMirror = mirror.reflectModule(moduleSymbol)
val instanceMirror = mirror.reflect(moduleMirror.instance)
这提供了一个有效的dbutils引用:

instanceMirror.instance
> Any = com.databricks.dbutils_v1.DBUtilsHolder$@25d7f14b
作为比较:

com.databricks.dbutils_v1.DBUtilsHolder
> com.databricks.dbutils_v1.DBUtilsHolder.type = com.databricks.dbutils_v1.DBUtilsHolder$@25d7f14b
要列出可用字段,请执行以下操作:

val fields = moduleSymbol.typeSignature.decls.filter(_.asTerm.isVal)
for (f <- fields) {
    println(f)
    val fieldMirror = instanceMirror.reflectField(f.asTerm)
}
> value dbutils0
> value dbutils
val fields=moduleSymbol.typeSignature.decls.filter(uu.asTerm.isVal)
对于(f)值dbutils0
>值dbutils
问题是如何扩展fieldMirror以访问dbutils.secrets.get(s,k)

试试看

fieldMirror.get.asInstanceOf[...].secrets.get(scope = "myScope", key = "myKey")
您应该将(
fieldMirror.get.asInstanceOf[…])
dbutils
强制转换为其类型

我假设您静态地知道
dbutils
的类型。否则,访问
dbutils.secrets.get(s,k)
会有点困难(然后您应该提供有关
dbutils
secrets
.get
等的更多详细信息)。

试试看

fieldMirror.get.asInstanceOf[...].secrets.get(scope = "myScope", key = "myKey")
您应该将(
fieldMirror.get.asInstanceOf[…])
dbutils
强制转换为其类型


我假设您静态地知道
dbutils
的类型。否则访问
dbutils.secrets.get(s,k)
会有点困难(然后您应该提供有关
dbutils
secrets
get
等的更多详细信息。).

DBUtilsHolder是一种特性。我们需要找到在对象
secrets.get()上实现acutal companinon的方法,以便能够应用运行时反射

在此之前,使用它的另一种方法是使用sbt、Maven或Gradle直接从Databrick访问jar,而无需反射。
对于Spark 3.0及更高版本,请从Databricks CLI下载jar并使用它,直到正式发布为止。

DBUtilsHolder是一种特性。我们需要找到实现acutal CompanyOn object
secrets.get()的方法,以便能够应用运行时反射

在此之前,使用它的另一种方法是使用sbt、Maven或Gradle直接从Databrick访问jar,而无需反射。 对于Spark 3.0及更高版本,从Databricks CLI下载jar并使用它,直到正式发布