Как вызвать 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 и используйте его до официального выпуска.