【问题标题】:spark scala most efficient way to do partial string countspark scala 进行部分字符串计数的最有效方法
【发布时间】:2015-05-19 17:39:44
【问题描述】:

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

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 时调用它?)

我似乎可以在 pgsql 中使用 LIKE 轻松完成此操作,但不确定是否存在以相同方式工作的 RDD 连接。

任何帮助将不胜感激。

【问题讨论】:

  • 在 rdd 转换中使用正则表达式似乎是可行的。
  • 可以,但我必须对所有 1000 万行字符串都这样做,所以我认为最好是并行处理,或者至少均匀分布到每个集群。跨度>
  • @qmeeeeeee Set1 的预期大小是多少?
  • @Odomontois 是 10,而且总是 10
  • @qmeeeeeee,rdd转换自动并行处理

标签: string scala apache-spark match


【解决方案1】:

所以按照 Yijie Shen 的建议,您可以使用正则表达式:

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

【讨论】:

  • 哦,好的,我明白了!这更有意义
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-27
相关资源
最近更新 更多