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

G.S*_*leh 2 scala apache-spark

假设这些是我的CSV文件:

11111;44444
22222;55555
11111;44444
33333;99999
11111;77777
22222;99999
Run Code Online (Sandbox Code Playgroud)

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

(11111,2)
(22222,2)
(33333,1)
Run Code Online (Sandbox Code Playgroud)

我试过了:

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()

  }
Run Code Online (Sandbox Code Playgroud)

我明白了:

(22222;55555,1)
(22222;99999,1)
(11111;77777,1)
(11111;44444,2)
(33333;99999,1)
Run Code Online (Sandbox Code Playgroud)

我怎样才能用第一把键巩固以获得预期的结果?

jkg*_*yti 7

我可能只计算不同的值.

textFile.distinct() // remove all duplicate key;value pairs
    .map( line => line.split(";")(0) ) // extract the keys
    .map( k => (k,1) ) // convert to countable tuples
    .reduceByKey(_+_) // count keys
Run Code Online (Sandbox Code Playgroud)

逐步地,将发生以下情况

假设输入是:

11111;44444
22222;55555
11111;44444
33333;99999
11111;77777
22222;99999
Run Code Online (Sandbox Code Playgroud)
  1. distinct()

输入变为:

11111;44444
22222;55555
33333;99999
11111;77777
22222;99999
Run Code Online (Sandbox Code Playgroud)
  1. .map( line => line.split(";")(0) ).map( k=> (k,1) )(或 .map( line => (line.split(";")(0),1) )在一张地图中)

输入变为:

11111,1
22222,1
33333,1
11111,1
22222,1
Run Code Online (Sandbox Code Playgroud)
  1. reduceByKey(_+_)

事情总结如下:

11111,2
22222,2
33333,1
Run Code Online (Sandbox Code Playgroud)