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 udf接受具有不同数据类型的列表?_Scala_Apache Spark_User Defined Functions - Fatal编程技术网

Scala 如何使spark udf接受具有不同数据类型的列表?

Scala 如何使spark udf接受具有不同数据类型的列表?,scala,apache-spark,user-defined-functions,Scala,Apache Spark,User Defined Functions,我的底层函数定义如下: def rowToSHA1(s: Seq[Any]): String = { //return sha1 of sequence } } 以下是我的udf的定义: val toSha = udf[String, Seq[Any]](rowToSHA1) df.withColumn("shavalue",(toSha(array($"id",$"name",$"description",$"accepted"))) 当我只传递一个字符串列表作为参数时,它就工

我的底层函数定义如下:

def rowToSHA1(s: Seq[Any]): String = {
   //return sha1 of sequence
 } 
}
以下是我的udf的定义:

val toSha = udf[String, Seq[Any]](rowToSHA1)

df.withColumn("shavalue",(toSha(array($"id",$"name",$"description",$"accepted")))
当我只传递一个字符串列表作为参数时,它就工作了,但当存在布尔值时,我会得到一个错误

org.apache.spark.sql.AnalysisException: cannot resolve 'array(`id`, `name`, 
`description`, `accepted`)' due to data type mismatch: input to function 
array should all be the same type, but it's [string, string, string, 
boolean];;
我正在探索泛型函数的使用,这是个好主意吗

修复:在应用函数之前将我的列转换为字符串

df.withColumn("shavalue",(toSha(array($"id",$"name",$"description",$"accepted".cast("string)))

对于这种情况,我所知道的最好的解决方案就是将所有内容转换为字符串,当您读取/创建数据帧时,请确保所有内容都是字符串,或者在某个时候转换它。稍后,您可以将if转换回任何其他类型。

您可以将boolean作为一个单独的值传递给udf函数。您可以按照此线程进行操作。它并没有回答问题,但更多的是解决问题。