繁体   English   中英

字数(频率)spark rdd scala

[英]word count(frequency) spark rdd scala

如果我有一个rdd跨簇并且我想进行字数统计

我不仅要计算出现次数,还想获得频率,它定义为计数/总计数

在Scala中这样做的最佳和有效方法是什么? 如何在一个工作流程中同时完成约简工作并计算总数?

顺便说一句,我知道纯粹的字数统计可以通过这种方式完成。

text_file = spark.textFile("hdfs://...")
counts = text_file.flatMap(lambda line: line.split(" ")) \
             .map(lambda word: (word, 1)) \
             .reduceByKey(lambda a, b: a + b)
counts.saveAsTextFile("hdfs://...")

但是如果使用聚合,有什么区别? 在火花工作流程方面

    val result = pairs
       .aggregate(Map[String, Int]())((acc, pair) => 
            if(acc.contains(pair._1)) 
                acc ++ Map[String, Int]((pair._1, acc(pair._1)+1)) 
            else 
                acc ++ Map[String, Int]((pair._1, pair._2))
          , 
          (a, b) => 
              (a.toSeq ++ b.toSeq)
                 .groupBy(_._1)
                 .mapValues(_.map(_._2).reduce(_ + _))
       )

你可以用这个

val total = counts.map(x => x._2).sum() 
val freq  = counts.map(x => (x._1, x._2/total))

还存在Accumulator的概念,它是一个只写变量,您可以使用它来避免使用sum()动作,但是您的代码将需要进行大量更改。

暂无
暂无

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

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