计算scala spark-RDD中csv文件中出现的次数

时间:2016-03-30 09:20:31

标签: scala apache-spark

假设这些是我的CSV文件:

11111;44444
22222;55555
11111;44444
33333;99999
11111;77777
22222;99999

我希望第一列中出现的次数与第二列的值不同。 像这样:

(11111,2)
(22222,2)
(33333,1)

我试过了:

object CountDestOcc {
  def main(args: Array[String]) {
    val conf = new SparkConf()
    .setAppName("Word Count")
    .setMaster("local")

    val sc = new SparkContext(conf)

    //loading text file into textFile object .(RDD)
    val textFile = sc.textFile(args(0))

   val appsdest = textFile.flatMap (line => line.split(" ")).map(p=>(p,1)).reduceByKey(_+_).collect()
   appsdest.foreach(println)
   sc.stop()

  }

我明白了:

(22222;55555,1)
(22222;99999,1)
(11111;77777,1)
(11111;44444,2)
(33333;99999,1)

我如何只用第一把键合并才能得到预期的结果?

2 个答案:

答案 0 :(得分:7)

我可能只计算不同的值。

11111;44444
22222;55555
11111;44444
33333;99999
11111;77777
22222;99999

逐步地,将发生以下情况

假设输入为:

distinct()
  1. 11111;44444 22222;55555 33333;99999 11111;77777 22222;99999
  2. 输入变为:

    .map( line => line.split(";")(0) )
    1. .map( k=> (k,1) ).map( line => (line.split(";")(0),1) )(或11111,1 22222,1 33333,1 11111,1 22222,1 在一张地图中)
    2. 输入变为:

      reduceByKey(_+_)
      1. 11111,2 22222,2 33333,1
      2. 事情总结为:

        PyUnit

答案 1 :(得分:0)

您可以将其添加到您的代码中:

val appsdest = textFile.flatMap (line => line.split(" ")).
map(p=>(p,1)).reduceByKey(_+_). //your code
map(case(String, Int) => (String.split(";")(0),1)). //ditch the count to get distinctness
reduceByKey(_+_).collect()

这应该有效。我发布这个答案,用原始代码dev帮助OP。目标可以用许多其他更好的方法来实现。