如何从applications.properties(配置文件)调用spark函数(带参数)?

8wtpewkr  于 2021-07-09  发布在  Spark
关注(0)|答案(1)|浏览(338)

所以,我有一个名为 application.properties 其中包含某些值,如:

dev.execution.mode = local
dev.input.base.dir = /Users/debaprc/Documents/QualityCheck/Data
dev.schema.lis = asin StringType,subs_activity_date DateType,marketplace_id DecimalType

我在spark代码中将这些值用作字符串,例如:

def main(args: Array[String]): Unit = {
    val props = ConfigFactory.load()
    val envProps = props.getConfig("dev")

    val spark = SparkSession.builder.appName("DataQualityCheckSession")
      .config("spark.master", envProps.getString("execution.mode"))
      .getOrCreate()

现在我在spark代码中定义了一些函数(func1、func2等)。我想在我的示例中指定要调用的函数以及相应的参数 application.properties 文件。像这样:

dev.functions.lis = func1,func2,func2,func3
dev.func1.arg1.lis = arg1,arg2
dev.func2.arg1.lis = arg3,arg4,arg5
dev.func2.arg2.lis = arg6,arg7,arg8
dev.func3.arg1.lis = arg9,arg10,arg11,arg12

现在,一旦我指定了这些,我在spark中该怎么做,用提供的参数调用函数?或者我需要以不同的方式指定函数和参数吗?

4ioopgfo

4ioopgfo1#

我同意@cchantep的观点,这种方法似乎是错误的。但是如果您仍然想这样做,我会将属性文件中的函数名与代码中的实际函数/方法解耦。
我试过这个,效果很好:

def function1(args: String): Unit = {
  println(s"func1 args: $args")
}

def function2(args: String): Unit = {
  println(s"func2 args: $args")
}

val functionMapper: Map[String, String => Unit] = Map(
  "func1" -> function1,
  "func2" -> function2
)

val args = "arg1,arg2"

functionMapper("func1")(args)
functionMapper("func2")(args)

输出:

func1 args: arg1,arg2
func2 args: arg1,arg2

编辑:输出示例的更简单方法。

相关问题