数据:
班级 ID 姓名 年龄 性别 科目 成绩
12 张三 25 男 chinese 50
12 张三 25 男 math 60
12 张三 25 男 english 70
12 李四 20 男 chinese 50
12 李四 20 男 math 50
12 李四 20 男 english 50
12 王芳 19 女 chinese 70
12 王芳 19 女 math 70
12 王芳 19 女 english 70
12 小蔡 19 女 chinese 70
12 小蔡 19 女 math 100
12 小蔡 19 女 english 70
13 张大三 25 男 chinese 60
13 张大三 25 男 math 60
13 张大三 25 男 english 70
13 李大四 20 男 chinese 50
13 李大四 20 男 math 60
13 李大四 20 男 english 50
13 王小芳 19 女 chinese 70
13 王小芳 19 女 math 80
13 王小芳 19 女 english 7
题目和答案:
val conf = new SparkConf()
conf.setMaster("local[2]").setAppName("1")
val sc = new SparkContext(conf)
val rdd = sc.textFile("D:\\ideaWorkspace\\myscala1\\src\\input\\a.txt")
val mapRDD = rdd.map(x=>x.split(" "))
val cacheRDD = mapRDD.cache()
val num = rdd.map(x=>x.split("\\s+")(1)).distinct().count()
val num1 = cacheRDD.map(x=>(x(1),x(2))).filter(x=>x._2.toInt<25).distinct().count()
val num2 = cacheRDD.map(x=>(x(1),x(2))).filter(x=>x._2.toInt==20).distinct().count()
val num3 = cacheRDD.map(x=>(x(1),x(2))).filter(x=>x._2.toInt>20).distinct().count()
val num4 = cacheRDD.map(x=>(x(1),x(3))).filter(x=>x._2.equals("男")).distinct().count()
val num5 = cacheRDD.map(x=>(x(1),x(3))).filter(x=>x._2.equals("女")).distinct().count()
val num6 = cacheRDD.map(x=>(x(0),x(1))).filter(x=>x._1.toInt==12).distinct().count()
val num7 = cacheRDD.map(x=>(x(0),x(1))).filter(x=>x._1.toInt==13).distinct().count()
val tuple = cacheRDD.map(x => (x(4), x(5), 1)).filter(x => x._1.equals("chinese")).map(x => (x._2.toInt, x._3)).reduce((x, y) => (x._1 + y._1, x._2 + y._2))
println(tuple._1 / tuple._2.toDouble)
val tuple2 = cacheRDD.map(x => (x(4), x(5), 1)).filter(x => x._1.equals("math")).map(x => (x._2.toInt, x._3)).reduce((x, y) => (x._1 + y._1, x._2 + y._2))
println(tuple2._1 / tuple2._2.toDouble)
val tuple3 = cacheRDD.map(x => (x(4), x(5), 1)).filter(x => x._1.equals("english")).map(x => (x._2.toInt, x._3)).reduce((x, y) => (x._1 + y._1, x._2 + y._2))
println(tuple3._1 / tuple3._2.toDouble)
val r1 = cacheRDD.map(x=>(x(1),1)).reduceByKey(_+_)
val r2 = cacheRDD.map(x=>(x(1),(x(5).toInt))).reduceByKey(_+_)
r2.join(r1).map(x=>(x._1,x._2._1/x._2._2.toDouble))
cacheRDD.map(x=>(x(1),((x(5).toInt),1))).reduceByKey((x,y)=>(x._1+y._1,x._2+y._2)).map(x=>(x._1,x._2._1/x._2._2.toDouble)).collect()
cacheRDD.map(x=>(x(0),(x(5).toInt,1))).reduceByKey((x,y)=>(x._1+y._1,x._2+y._2)).filter(x=>x._1.toInt==12).map(x=>(x._1,x._2._1/x._2._2.toDouble))
cacheRDD.map(x=>(x(0),(x(5).toInt,1,x(3)))).filter(x=>x._1.toInt==12).filter(x=>x._2._3.equals("男")).reduceByKey((x,y)=>(x._1+y._1,x._2+y._2,x._3)).map(x=>(x._1,x._2._3,x._2._1/x._2._2.toDouble))
cacheRDD.map(x=>(x(0),(x(5).toInt,1,x(3)))).filter(x=>x._1.toInt==12).filter(x=>x._2._3.equals("女")).reduceByKey((x,y)=>(x._1+y._1,x._2+y._2,x._3)).map(x=>(x._1,x._2._3,x._2._1/x._2._2.toDouble))
cacheRDD.map(x=>(x(4),x(5))).filter(x=>x._1.equals("chinese")).sortBy(x=>x._2.toInt,false).first()._2
cacheRDD.map(x=>(x(4),x(0),x(5))).filter(x=>x._1.equals("chinese") && x._2.toInt==12).sortBy(x=>x._3.toInt,true).take(1).foreach(x=>println(x._3))
cacheRDD.map(x=>(x(4),x(0),x(5))).filter(x=>x._1.equals("math") && x._2.toInt==13).sortBy(x=>x._3.toInt,false).take(1).foreach(x=>println(x._3))
cacheRDD.map(x=>(x(0),x(1),x(3),x(5))).filter(x=>x._1.toInt ==12&&x._3.equals("女")).map(x=>(x._2,x._4.toInt)).reduceByKey(_.toInt+_.toInt).filter(x=>x._2.toInt>150).count()
//1.求出数学大于等于70,且年龄大于等于19岁的学生
val mathRDD = cacheRDD.map(x => (x(1), x(2), x(4), x(5))).filter(x => x._2.toInt >= 19 && x._3.equals("math") && x._4.toInt >= 70).map(x=>(x._1,1))
//2.求出成绩大于150的学生
val sumRDD = cacheRDD.map(x => (x(1),x(5).toInt)).reduceByKey(_+_).filter(x=>x._2>150).distinct()
//join之后,求出人数和分数和
val t1 = mathRDD.join(sumRDD).map(x=>(x._2._1,x._2._2)).reduce((x,y)=>(x._1+y._1,x._2+y._2))
//得到平均分
val avg = t1._2/t1._1.toDouble