假设这些是我的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)
我如何只用第一把键合并才能得到预期的结果?
答案 0 :(得分:7)
我可能只计算不同的值。
11111;44444
22222;55555
11111;44444
33333;99999
11111;77777
22222;99999
逐步地,将发生以下情况
假设输入为:
distinct()
11111;44444
22222;55555
33333;99999
11111;77777
22222;99999
输入变为:
.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
在一张地图中)输入变为:
reduceByKey(_+_)
11111,2
22222,2
33333,1
事情总结为:
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。目标可以用许多其他更好的方法来实现。