【问题标题】:scala Spark get the top words in each row of Arrayscala Spark 获取 Array 每一行中的顶部单词
【发布时间】:2015-02-10 20:59:34
【问题描述】:

我无法在 Array of int 和 Strings 中获得最上面的单词。

请参阅下面的数组和所需的输出: 考虑 n 是一个 RDD,并建议我获取输出所需的函数。

scala> n.take(10)
res3: Array[(Int, String)] = Array((4,Hi how are you ,how), (2,hello good good to hear good))

O/P : Array((4,how),(2,good)) // Ist 行的 Top word 怎么样 .. good 是第二行的 top word .

我们可以使用下面的代码来获取唯一最热门的单词,但我想在每一行中都获得最热门的单词。

val msg = n.map{case(val1, val2) => (val2).mkString("")}
val words =msg.flatMap(x => x.split(" "))
val result = words.map(x => (x, 1)).reduceByKey((x, y) => x + y)
val sortReuslts=result.sortBy(x => (-x._2,x._1))

谢谢:)

【问题讨论】:

    标签: scala apache-spark scala-collections rdd


    【解决方案1】:

    让我们首先创建一个函数来查找给定文本中出现频率最高的单词:

    def findMaxFrequencyWord(text: String): (String, Int) = {
        text.split("\\W+")
            .map(x => (x, 1))
            .groupBy(y => y._1)
            .map{ case (x,y) => x -> y.length }
            .toArray
            .sortBy(x => -x._2)
            .head 
    }
    
    findMaxFrequenceWord("hi, how are you, how")
    > (how, 2)
    

    创建(Int, String)的rdd:

    val arr = Array((4, "how how ok"), (3, "i see, you see"), (5, "fine, it is fine"))
    
    val n = sc.parallelize(arr)  
    

    在rdd中的每个String中查找最大频繁词:

    val result = n.map{ case (x, y)  => x -> findMaxFrequencyWord(y)._1 }
    
    result.take(3)
    
    > Array[(String, Int)] = Array((4, how), (3, see), (5, fine))
    

    【讨论】:

    • 谢谢@Shyamendra Solanki 非常有帮助...只是一个简单的问题如果我想要top N temrs,我应该使用哪种方法,我尝试了.. take(n) 它没有给出.. 请建议我..再次感谢您的快速回复:)
    • @MapReddy 如果您需要前 N 个词,请在 sortBy 之后将 head 替换为 take(N),假设每个字符串总是至少有 N 个不同的词。
    • 谢谢-@Shyamendra Solanki
    猜你喜欢
    • 2019-07-12
    • 2020-01-08
    • 2013-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-11
    • 2016-05-24
    • 1970-01-01
    相关资源
    最近更新 更多