【问题标题】:How to make spark udf accept a list with different data types?如何使 spark udf 接受具有不同数据类型的列表?
【发布时间】:2019-02-01 20:29:10
【问题描述】:

我的底层函数是这样定义的:

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

【问题讨论】:

标签: scala apache-spark user-defined-functions


【解决方案1】:

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

【讨论】:

  • 它没有回答问题,但更多的是一种解决方法。
猜你喜欢
  • 1970-01-01
  • 2016-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-04
  • 1970-01-01
  • 2021-08-07
  • 2017-06-11
相关资源
最近更新 更多