Получить имя класса работающего задания Databricks

Существует проект Apache Spark Scala (runnerProject), который использует другой проект в том же пакете (sourceProject). Цель исходного проекта - получить имя и версию выполняемого задания Databricks.

Проблема со следующим методом является то, что, когда он вызывается из runnerProject, он возвращает sourceProject в детали, а не runnerProject имя и версию "s.

sourceProject метод:

       class EnvironmentInfo(appName: String) {
 
override def getJobDetails(): (String, String) = {
    val classPackage = getClass.getPackage

    val jobName = classPackage.getImplementationTitle
    val jobVersion = classPackage.getImplementationVersion

    (jobName, jobVersion)
  }
 }

runnerProject использует sourceProject как пакет:

       import com.sourceProject.environment.{EnvironmentInfo}

 class runnerProject {
  def start(
      environment: EnvironmentInfo
  ): Unit = {

// using the returned parameters of the environment

}

Как можно обойти эту проблему, чтобы getJobDetails() выполнялся в sourceProject, чтобы его можно было вызывать и из других проектов, а не только из runnerProject. Кроме того, он должен возвращать сведения о задании "вызывающий".

Заранее спасибо!:)

1 ответ

Решение

Попробуйте следующее: он получает имя вызывающего класса из трассировки стека и использует его для получения фактического класса и его пакета.

class EnvironmentInfo(appName: String) {
 
override def getJobDetails(): (String, String) = {
    val callingClassName = Thread.currentThread.getStackTrace()(2).getClassName
    val classPackage = Class.forName(callingClassName).getPackage

    val jobName = classPackage.getImplementationTitle
    val jobVersion = classPackage.getImplementationVersion

    (jobName, jobVersion)
  }
 }

Он будет работать, если вы вызовете его напрямую, он может дать вам неправильный пакет, если вы вызовете его из лямбда-функции.

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