1

我想打电话

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

问题是如何扩展fieldMirror以访问 dbutils.secrets.get(s, k)

4

2 回答 2

0

DBUtilsHolder 是一个特征。我们需要找到在其中实现了实际伴侣对象secrets.get()方法,以便能够应用运行时反射。

直到那时,其他使用它的方法是使用 sbt、Maven 或 Gradle 从 Databricks 直接访问 jar,而无需反射。对于 Spark 3.0 及更高版本,从 Databricks CLI 下载 jar 并使用它,直到正式发布为止。

于 2020-09-03T14:40:42.737 回答
0

尝试

fieldMirror.get.asInstanceOf[...].secrets.get(scope = "myScope", key = "myKey")

您应该将 ( fieldMirror.get.asInstanceOf[...])dbutils转换为它的类型。

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

于 2020-08-28T09:31:05.170 回答