我正在使用UDF函数应用于spark数据帧中的一列字符串,这些字符串迭代words
个单词集,并查找给定的列字符串是否包含该集合中的任何单词(请参阅下文):
udf { (s: String) => words.value.exists(word => s.contains(word)) }
我如何更改此函数以便返回words
集中所有在字符串中找到的项目的列表?
我尝试过使用when
和otherwise
:
udf { (s: String) => when(words.value.exists(word => s.contains(word)), word).otherwise(null) }
但我得到type mismatch
,无论如何,我认为这只会返回第一场比赛。我只是学习scala和spark,所以欢迎任何建议。
答案 0 :(得分:2)
传递给你在这里使用的udf
函数的参数应该是一个简单的Scala函数 - 任何使用SQL函数如when
都会返回一个Column
对象,这不是这些函数的预期返回类型(它们应返回Spark DataFrames中作为数据类型支持的类型 - 基元,数组,映射,案例类等)。
所以,实现只是:
udf { (s: String) => words.value.filter(word => s.contains(word)) }
这会创建一个输入类型为String
且输出类型为Seq[String]
的UDF,这意味着生成的列将为ab Array
列。
例如:
val words = sc.broadcast(Seq("aaa", "bbb"))
val udf1 = udf { (s: String) => words.value.filter(word => s.contains(word)) }
Seq("aaabbbb", "bbb", "aabb").toDF("word").select(udf1($"word")).show()
// +----------+
// | UDF(word)|
// +----------+
// |[aaa, bbb]|
// | [bbb]|
// | []|
// +----------+