我将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)
总有写得更好吗?
答案 0 :(得分:2)
UDFRegistration.register
带有以下变体:
UserDefinedFunction
UDF0
, UDF1
, ..., UDF22
,例如for binary functions:
def register(name: String, f: UDF2[_, _, _], returnType: DataType): Unit
Scala Function0
, Function1
, ..., Function22
例如用于二进制函数
def register[RT, A1, A2](name: String, func: (A1, A2) ⇒ RT)(implicit arg0: scala.reflect.api.JavaUniverse.TypeTag[RT], arg1: scala.reflect.api.JavaUniverse.TypeTag[A1], arg2: scala.reflect.api.JavaUniverse.TypeTag[A2]): UserDefinedFunction
没有采用类名的变体。您的代码不会仅因为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
但这当然不是你的意思。