spark scala 进行部分字符串计数的最有效方法

spark scala most efficient way to do partial string count

我有一个关于在 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)

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

我似乎能够在 pgsql 中使用 LIKE 很容易地做到这一点,但不确定是否有以相同方式工作的 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()