Spark中的callUDF和udf.register之间的区别

时间:2019-02-22 16:59:59

标签: scala apache-spark apache-spark-sql

我将udf作为导入的一部分,并在我的Spark代码中使用了它

    spark.sql("""DROP TEMPORARY FUNCTION IF EXISTS hash""")
    val name = "hash"
    spark.sql(s"create temporary function $name as '${classOf[GenericHash].getName}'")
    val hash = callUDF(name, _: Column)

它工作正常,但是我被告知要用udf.register注册UDF。这个操作符_:做什么?当我尝试这样写的时候

val hash = spark.sqlContext.udf.register(name, classOf[GenericHash].getName)

我收到一条错误消息

error]  java.lang.UnsupportedOperationException: Schema for type Char is not supported (ScalaReflection.scala:780)
[error] org.apache.spark.sql.catalyst.ScalaReflection$$anonfun$schemaFor$1.apply(ScalaReflection.scala:780)
[error] org.apache.spark.sql.catalyst.ScalaReflection$$anonfun$schemaFor$1.apply(ScalaReflection.scala:715)
[error] org.apache.spark.sql.catalyst.ScalaReflection$class.cleanUpReflectionObjects(ScalaReflection.scala:824)

总有写得更好吗?

1 个答案:

答案 0 :(得分:2)

UDFRegistration.register带有以下变体:

没有采用类名的变体。您的代码不会仅因为String中的Scala(Int) => Char而失败,因此匹配

 
def register[RT, A1](name: String, func: (A1) ⇒ RT)(implicit arg0: scala.reflect.api.JavaUniverse.TypeTag[RT], arg1: scala.reflect.api.JavaUniverse.TypeTag[A1]): UserDefinedFunction

但这当然不是你的意思。