Spark(scala)数据帧 - 返回给定字符串中找到的一组单词的列表

时间:2017-08-24 16:20:08

标签: scala apache-spark

我正在使用UDF函数应用于spark数据帧中的一列字符串,这些字符串迭代words个单词集,并查找给定的列字符串是否包含该集合中的任何单词(请参阅下文):

udf { (s: String) => words.value.exists(word => s.contains(word)) }

我如何更改此函数以便返回words集中所有在字符串中找到的项目的列表?

我尝试过使用whenotherwise

udf { (s: String) => when(words.value.exists(word => s.contains(word)), word).otherwise(null) }

但我得到type mismatch,无论如何,我认为这只会返回第一场比赛。我只是学习scala和spark,所以欢迎任何建议。

1 个答案:

答案 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]|
// |        []|
// +----------+