【问题标题】:How to invoke Spark functions (with arguments) from applications.properties(config file)?如何从applications.properties(配置文件)调用Spark函数(带参数)?
【发布时间】:2023-03-16 11:42:01
【问题描述】:

所以,我有一个名为 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 你会怎么做才能实现这个目标?

标签: scala function apache-spark config typesafe-config


【解决方案1】:

我同意@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

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

【讨论】:

  • 您的方法出现 2 个错误:对于 functionMapper 代码,我收到错误 missing argument list for method function1 in object MyApp。同样对于调用,我收到错误,'Object' does not take parameters
  • 我已经编辑了代码以提供一个更简单的完整工作示例。请尝试该建议
  • 如果所有函数 function1, function2 etc... 都具有相同数量和类型的参数,则此方法可以正常工作。以及相同的返回类型。如果function1有2个参数(字符串,字符串),而function2有1个参数(字符串)怎么办?
  • 您可以传递完整的 args 字符串,并在每个函数中将其拆分以解析您需要的参数数量
  • 如果解决了您的问题,您能否接受该解决方案?这将有助于我的声誉,我将非常感激 :)
猜你喜欢
  • 1970-01-01
  • 2019-05-07
  • 2016-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-02
  • 2015-01-21
  • 1970-01-01
相关资源
最近更新 更多