计算每个字符串的值的出现次数

时间:2018-03-15 17:46:22

标签: scala apache-spark rdd

我在表单上有一个文件

org.apache.spark.rdd.RDD[(String, Array[String])] = MapPartitionsRDD[364]

这是一个文件,其中我有几个键(string),每个键有许多值(Array[String])。 我希望能够为每个单独的字符串计算Value中每次出现的次数。我尝试了不同的方法,但我还没有发现任何可行的方法。

感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

您可以展开数据并生成RDD[((String, String), Int)],其中每一行都是您展开的一对键值的一次出现次数及其发生的次数(展开时只有1次)。然后,您只需要reduceByKey并对事件求和。

rdd
    .flatMap { case (key, values) => values.map(value => (key, value) -> 1) }
    .reduceByKey(_+_)

答案 1 :(得分:0)

您可以使用groupBymapValues 获取Array[String] 中每个字符串的出现次数

假设你有org.apache.spark.rdd.RDD[(String, Array[String])]

val rdd = sc.parallelize(Seq(
  ("str1", Array("test1", "test2", "test1", "test2", "test3")),
  ("str2", Array("test2", "test2", "test12", "test2", "test5"))
))
//rdd: org.apache.spark.rdd.RDD[(String, Array[String])]

正如我上面所解释的,你可以做到

val counted = rdd.map(x => (x._1, x._2.groupBy(identity).mapValues(_.length)))
//counted: org.apache.spark.rdd.RDD[(String, scala.collection.immutable.Map[String,Int])]

如果你打印它们

counted.foreach(println)
//(str1,Map(test2 -> 2, test1 -> 2, test3 -> 1))
//(str2,Map(test2 -> 3, test5 -> 1, test12 -> 1))
//res0: Unit = ()

我希望答案很有帮助