如何通过参数Class生成Function1并返回Class

时间:2019-03-04 08:13:14

标签: scala reflect

我想将一个Scala对象方法注册到spark udf中。现在我通过scala反射得到了MethodMirror,并通过java反射得到了Parameter。但是我无法生成用于注册到spark.udf的Function对象。如:

object ArrayUdfs {
  def array2String(arr: Seq[Long])= {
    arr.mkString(",")
  }
}

我想将方法​​'array2String'注册到spark udf中。

首先,我得到了MethodMirror:

def getObjectMethod(clazzPath:String, methodName:String)  = {
   import scala.reflect.runtime.universe

   lazy val runtimeMirror = universe.runtimeMirror(getClass.getClassLoader)
   lazy val module = runtimeMirror.staticModule(clazzPath)
   lazy val obj = runtimeMirror.reflectModule(module)
   lazy val objMirror = runtimeMirror.reflect(obj.instance)
   lazy val method = obj.symbol.typeSignature.member(universe.TermName(methodName)).asMethod
   lazy val methodObject = objMirror.reflectMethod(method)
   methodObject
}

lazy val method = getObjectMethod(clazzPath, funName);

第二。我得到参数。

def getObjectMethodParams(clazzPath:String, methodName:String): Array[Parameter] = {
    val methods = Class.forName(clazzPath).getDeclaredMethods()
    var params: Array[Parameter] = null;
    methods.foreach(method => {
      if (method.getName == methodName) params = method.getParameters
    })
    params
}

val params = getObjectMethodParams(clazzPath, funName)

第三,将其注册到spark.udf

val function1: Function1[Seq[String], String] = (arr) => {
   method.apply(arr).asInstanceOf[String]
}

spark.udf.register("array2String", function1)

所以我想用'params'对象替换'Function1 [Seq [String],String]'中的'Seq [String]'。 “ Function1 [Seq [String],String]”中的“ String”相同。

0 个答案:

没有答案