繁体   English   中英

Spark Scala做部分字符串计数的最有效方法

[英]spark scala most efficient way to do partial string count

我有一个关于在1000万长度的火花RDD(或scala Array)中进行部分字符串匹配的最有效方法的问题。 考虑以下:

val set1 = Array("star wars", "ipad") //These are the String I am looking for
val set2 = RDD[("user1", "star wars 7 is coming out"),
           ("user1", "where to watch star wars"),
           ("user2", "star wars"),
           ("user2", "cheap ipad")]

我希望能够计算属于Set1的每个字符串(也出现在Set2中)的出现次数。 所以结果应该是这样的:

Result = ("star wars", 3),("ipad", 1)

我还想统计搜索该词的用户(即不同用户)的数量,因此结果应为:

Result = ("star wars", 2), ("ipad", 1)

我尝试了2种方法,第一种方法涉及将RDD字符串转换为set,flatMapValues,然后执行联接操作,但是这会消耗内存。 我正在考虑的另一种方法是正则表达式方法,因为只需要计数并给出确切的字符串,但是我不知道如何提高效率(通过在映射RDD时创建函数并调用它?)

我似乎能够使用LIKE在pgsql中相当容易地做到这一点,但是不确定是否存在以相同方式工作的RDD联接。

任何帮助将不胜感激。

因此,根据沈逸杰的建议,您可以使用正则表达式:

val regex = set1.mkString("(", "|", ")").r
val results = rdd.flatMap {
  case (user, str) => regex.findAllIn(str).map(user -> _)
}
val count = results.map(_._2).countByValue()
val byUser = results.distinct().map(_._2).countByValue()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM