如何使用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 objectsecrets.get()的方法,以便能够应用运行时反射
在此之前,使用它的另一种方法是使用sbt、Maven或Gradle直接从Databrick访问jar,而无需反射。
对于Spark 3.0及更高版本,从Databricks CLI下载jar并使用它,直到正式发布