RDD类型的Spark RDD上的聚合函数[String,Int,String]

时间:2017-02-02 06:32:59

标签: apache-spark aggregate spark-dataframe rdd

我们正在尝试在RDD上使用聚合功能。 其中RDD的形式为RDD [Strng,Int,String]

将元素列表指定为

List(("Amit1",45,"M"),("Amit2",43,"M"),("Amit3",28,"F"),("Amit4",33,"F"),("Amit5",18,"F")

Steps :-
val data = sc.parallelize(List(("Amit1",45,"M"),("Amit2",43,"M"),("Amit3",28,"F"),("Amit4",33,"F"),("Amit5",18,"F")))
val dataMap =  data.map(line => (line._1 , (line._2,line._3)))
dataMap.collect().foreach(println)

out put是: -

(Amit1,(45,M))
(Amit2,(43,M))
(Amit3,(28,F))
(Amit4,(33,F))
(Amit5,(18,F))

现在,我们尝试的是使用aggregateByKey,因为我们需要对学生进行分组,然后应用年龄总和以及类似学生的数量 我们使用了aggregateByKey但没有工作。

我们找到了方法: -

dataMap.aggregateByKey((0,0))((acc,value)=>(acc._1 +value._1,acc._2+1) ,(acc1,acc2)=>(acc1._1+acc2._1 , acc1._2 + acc2._2) ).collect()

输出

res27: Array[(String, (Int, Int))] = Array((Amit3,(28,1)), (Amit4,(33,1)), (Amit1,(63,2)), (Amit2,(43,1)))

由于

1 个答案:

答案 0 :(得分:0)

可以在不创建您创建的dataMap

的情况下完成
val data = sc.sparkContext.parallelize(List(("Amit1",45,"M"),("Amit2",43,"M"),("Amit3",28,"F"),("Amit4",33,"F"),("Amit5",18,"F")))
    println(data.count())
    println(data.map(_._2).sum())

如果您需要dataMap进一步实施,请使用以下代码:

val dataMap =  data.map(line => (line._1 , (line._2,line._3)))
dataMap.collect().foreach(println)
println(dataMap.count())
println(dataMap.map(_._2._1).sum())