【问题标题】:Using Apache-Spark, reduce or fold an RDD depending on a condition使用 Apache-Spark,根据条件减少或折叠 RDD
【发布时间】:2015-02-04 01:30:42
【问题描述】:

我正在使用 Apache Spark 和 Scala。我有一个 String,Int 的 RDD

val counts =words.map(word => (word, 1)).reduceByKey((a,b) => (a + b))     

现在我通过 Key 减少了 RDD,但我想添加另一个功能来减少相似的单词。

我虽然使用 Levenshtein 距离、欧几里得距离或余弦距离。

那么,我怎样才能应用这些功能之一来减少我的 RDD?

例子:

RDD ->  (forks,12), (fork,4), (chair,15) , (table,1), (tables,11)

承认相似度算法有效,我怎样才能获得减少的RDD,如:

RDD -> (fork,16), (table,12), (chair,15)

我尝试了类似的方法:

counts.foldLeft(){(x,y) => 
  if(x._1.euclideanDistance(y._1) > 0.9) 
    (x,x._2+y._2) 
}

【问题讨论】:

    标签: apache-spark rdd reduce fold


    【解决方案1】:

    你正在尝试的不会奏效。

    如果你只有一个distance(a, b)函数,解决问题确实效率低下,也很复杂。您需要使用 RDD.cartesian 来生成所有可能的 (word1, word2) 对。然后过滤掉距离太远的。现在你有了相似的词对。假设它们是(fox, fix)(fix, six),以及它们的反转。然后,您想要总结 foxfixsix 的计数。为此,您需要在由相似词对定义的图表中找到 连接的组件。获得每个单词的组件 ID 后,您可以通过组件 ID 将计数相加。

    我认为解决方案是编写一个可以将单词转换为“规范”形式的函数。它会将forksforkingforked 变成fork。然后你可以再次应用这个和reduceByKey

    在没有 Spark 的情况下执行此步骤将是最快的。一旦你用 Spark 计算了counts,你就有了一个很小的数据集——每个不同的词都有一个整数。最简单的方法是 collect 它,然后是 mapgroupBy counts 在本地。

    【讨论】:

      【解决方案2】:

      @Daniel 的回复可能是解决整体问题的正确方法。

      关于具体的q。当您在折叠中执行 if 时,您还需要在您的情况下提供 else 以保留 x 的当前计数

      【讨论】:

        猜你喜欢
        • 2019-06-28
        • 1970-01-01
        • 1970-01-01
        • 2016-12-05
        • 2015-10-07
        • 2015-06-05
        • 1970-01-01
        • 2018-09-14
        相关资源
        最近更新 更多