我在表单上有一个文件
org.apache.spark.rdd.RDD[(String, Array[String])] = MapPartitionsRDD[364]
这是一个文件,其中我有几个键(string
),每个键有许多值(Array[String]
)。
我希望能够为每个单独的字符串计算Value中每次出现的次数。我尝试了不同的方法,但我还没有发现任何可行的方法。
感谢您的帮助!
答案 0 :(得分:0)
您可以展开数据并生成RDD[((String, String), Int)]
,其中每一行都是您展开的一对键值的一次出现次数及其发生的次数(展开时只有1次)。然后,您只需要reduceByKey
并对事件求和。
rdd
.flatMap { case (key, values) => values.map(value => (key, value) -> 1) }
.reduceByKey(_+_)
答案 1 :(得分:0)
您可以使用groupBy
和mapValues
获取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 = ()
我希望答案很有帮助