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)
感谢解决此问题的想法和建议。
但是,我不确定通过案例课程的最佳方法是什么
无法使用案例类作为用户定义函数的参数。SQLStructTypes被映射到动态类型(没有更好的词)Row对象。
如果您想操作静态类型的对象,请使用 statically typed Dataset。
| 归档时间: |
|
| 查看次数: |
4536 次 |
| 最近记录: |