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

时间:2018-08-27 10:05:44

标签: 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")))

当我只传递一个字符串列表作为参数,但是当有布尔值时却报错,它就起作用了。

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];;

我正在探索泛型函数的使用,这是个好主意吗?

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

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

1 个答案:

答案 0 :(得分:1)

对于这种情况,我所知道的最佳解决方案是将所有内容都转换为String,当您读取/创建DataFrame时,请确保所有内容均为String或在某个时候将其转换。以后,您可以将其转换回其他任何类型。