将案例类传递给 Spark UDF

Yas*_*ash 5 scala user-defined-functions case-class apache-spark

我有一个 scala-2.11 函数,它根据提供的类类型从 Map 创建一个案例类。

def createCaseClass[T: TypeTag, A](someMap: Map[String, A]): T = {

    val rMirror = runtimeMirror(getClass.getClassLoader)
    val myClass = typeOf[T].typeSymbol.asClass
    val cMirror = rMirror.reflectClass(myClass)

    // The primary constructor is the first one
    val ctor = typeOf[T].decl(termNames.CONSTRUCTOR).asTerm.alternatives.head.asMethod
    val argList = ctor.paramLists.flatten.map(param => someMap(param.name.toString))

    cMirror.reflectConstructor(ctor)(argList: _*).asInstanceOf[T]
  }
Run Code Online (Sandbox Code Playgroud)

我试图在 Spark 数据帧的上下文中使用它作为 UDF。但是,我不确定通过案例课程的最佳方法是什么。下面的方法似乎不起作用。

def myUDF[T: TypeTag] = udf { (inMap: Map[String, Long]) =>
    createCaseClass[T](inMap)
  }
Run Code Online (Sandbox Code Playgroud)

我正在寻找这样的东西 -

case class MyType(c1: String, c2: Long)

val myUDF = udf{(MyType, inMap) => createCaseClass[MyType](inMap)}
Run Code Online (Sandbox Code Playgroud)

感谢解决此问题的想法和建议。

zer*_*323 4

但是,我不确定通过案例课程的最佳方法是什么

无法使用案例类作为用户定义函数的参数。SQLStructTypes被映射到动态类型(没有更好的词)Row对象。

如果您想操作静态类型的对象,请使用 statically typed Dataset