Scala spark中callUDF和udf.register之间的差异
我有一个udf作为导入的一部分,我正在spark代码中使用它Scala spark中callUDF和udf.register之间的差异,scala,apache-spark,apache-spark-sql,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) 它工作正常,但我被
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)
是否还有更好的编写方法?
UDFRegistration.register
有以下几种变体:
- ,例如:
- 例如二进制函数
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
Scala
中的String
是(Int)=>Char
因此匹配
def寄存器[RT,A1](名称:字符串,函数:(A1)⇒ RT)(隐式arg0:scala.reflect.api.JavaUniverse.TypeTag[RT],arg1:scala.reflect.api.JavaUniverse.TypeTag[A1]:UserDefinedFunction
但那当然不是你的意思
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