如何从 applications.properties(配置文件)调用 Spark 函数(带参数)?
How to invoke Spark functions (with arguments) from applications.properties(config file)?
所以,我有一个名为 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 中做什么,以使用提供的参数调用函数?还是我需要以不同的方式指定函数和参数?
我同意@cchantep 的观点,该方法似乎是错误的。但是,如果您仍然想做类似的事情,我会将属性文件中的函数名称与代码中的实际 functions/methods 分离。
我已经试过了,效果很好:
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
已编辑:带有输出示例的更简单方法。
所以,我有一个名为 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 中做什么,以使用提供的参数调用函数?还是我需要以不同的方式指定函数和参数?
我同意@cchantep 的观点,该方法似乎是错误的。但是,如果您仍然想做类似的事情,我会将属性文件中的函数名称与代码中的实际 functions/methods 分离。
我已经试过了,效果很好:
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
已编辑:带有输出示例的更简单方法。