scala - 如何让 spark udf 接受不同数据类型的列表?

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

当我只传递一个字符串列表作为参数时它有效,但当有 bool 值时我得到一个错误。

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)))

最佳答案

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

关于scala - 如何让 spark udf 接受不同数据类型的列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52036969/

相关文章:

java - 如何修复Java Spark提交错误: NoSuchMethodError: javax.validation.BootstrapConfiguration.getClockProviderClassName()Ljava/lang/String

apache-spark - PySpark:当另一列值满足条件时修改列值

scala - 从Scala将UDF注册到SqlContext以在PySpark中使用

scala - 需要在运行时从 jar 加载一个 scala 类并初始化它

scala - 使用 Dynamic 调用重载方法

类型别名的 Scala 隐式转换

scala - Spark `reduceGroups`错误重载方法与替代方案

apache-spark - PySpark 在 YARN 客户端模式下运行,但在 "User did not initialize spark context!"的集群模式下失败

sql - 将日期显示为 YYYY-MMM 的函数

pyspark - PickleException : expected zero arguments for construction of ClassDict (for numpy. 数据类型)