Spark(scala) - 迭代DF列并计算一组项目的匹配数

时间:2017-08-04 08:59:08

标签: scala apache-spark

所以我现在可以遍历数据框中的一列字符串并检查任何字符串是否包含大字典中的任何项目(请参阅here,感谢@ raphael-roth和@ {{ 3}})。基本的udf(不包括广播dict列表)是:

val checkerUdf = udf { (s: String) => dict.exists(s.contains(_)) }

df.withColumn("word_check", checkerUdf($"words")).show()

我要做的下一件事也是以最有效的方式计算dict集合中发生的匹配数量(我正在处理非常大的数据集和dict文件)。

我一直在尝试在udf中使用findAllMatchIn,同时使用count和map:

val checkerUdf = udf { (s: String) => dict.count(_.r.findAllMatchIn(s))

// OR
val checkerUdf = udf { (s: String) => dict.map(_.r.findAllMatchIn(s))

但是这会返回一个迭代器列表(空和非空)我得到一个类型不匹配(找到Iterator,必需的布尔值)。我不确定如何计算非空迭代器(countsizelength不起作用。)

知道我做错了什么吗?是否有更好/更有效的方式来实现我想要做的事情?

1 个答案:

答案 0 :(得分:1)

你可以从其他问题中改变一些答案

import org.apache.spark.sql.functions._
val checkerUdf = udf { (s: String) => dict.count(s.contains(_)) }

df.withColumn("word_check", checkerUdf($"words")).show()

鉴于dataframe

+---+---------+
|id |words    |
+---+---------+
|1  |foo      |
|2  |barriofoo|
|3  |gitten   |
|4  |baa      |
+---+---------+

和dict文件为

val dict = Set("foo","bar","baaad")

您应该输出

+---+---------+----------+
| id|    words|word_check|
+---+---------+----------+
|  1|      foo|         1|
|  2|barriofoo|         2|
|  3|   gitten|         0|
|  4|      baa|         0|
+---+---------+----------+

我希望答案很有帮助