Как вызвать Databricks dbutils с помощью Scala Reflection / Mirrors

Я хочу позвонить

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)

2 ответа

Пытаться

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() реализован, чтобы иметь возможность применять отражение во время выполнения.

До тех пор другой способ использования - это прямой доступ к банке из Databricks с использованием sbt, Maven или Gradle без отражения. Для Spark 3.0 и более поздних версий загрузите jar-файл из интерфейса командной строки Databricks и используйте его до официального выпуска.

Другие вопросы по тегам