Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala spark中callUDF和udf.register之间的差异_Scala_Apache Spark_Apache Spark Sql - Fatal编程技术网

Scala spark中callUDF和udf.register之间的差异

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) 它工作正常,但我被

我有一个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)

是否还有更好的编写方法?

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