我有一个csv文件,如下所示:
ID,NAME,SUBJECT,MARKS
1,ABC,ECONOMICS,50
1,ABC,SCIENCE,60
1,ABC,ENGLISH,70
2,XYZ,ECONOMICS,50
2,XYZ,ENGLISH,40
2,XYZ,SCIENCE,65
我能够将其加载到Spark中的RDD
empRDD = sc.textFile("/user/location/EMPmarksfile");
header = empRDD.first();
newEmpRDD = empRDD.filter(lambda x:x!=header);
PairEmpRDD = newEmpRDD.map(lambda x:(x.split(",")[0],x));
我试图使用RDD转换reduceByKey
或groupByKey
将每个学生的总分加起来,并期望结果为:
[1,ABC,180]
[2,XYZ,155]
答案 0 :(得分:1)
这是使用数据框api的方法
df = spark.read.csv("/user/location/EMPmarksfile", header=True, inferSchema=True)
df.groupBy("ID","NAME").sum("MARKS").show(10,False)
我们也可以使用基于rdd的api
finalRdd = newEmpRDD.map(lambda x:(x.split(",")))\
.map(lambda x: ((x[0],x[1]),int(x[3])))\
.reduceByKey(lambda x,y:x+y)\
.map(lambda x: (x[0][0],x[0][1],x[1]))