#在名为sparkwork.txt中有如下内容:
班级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
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 70
hdfs dfs -put sparkwork.txt /data/
#1. 一共有多少人参加考试?
scala> sc.textFile("/data/sparkwork.txt").collect.drop(1).map(_.split("\\s+")).groupBy(x=>x(1)).size
res6: Int = 6
#1.1 一共有多少个小于 20 岁的人参加考试?
scala> sc.textFile("/data/sparkwork.txt").collect.drop(1).map(_.split("\\s+")).filter(x=>x(2).toInt<20).groupBy(x=>x(1)).size
res10: Int = 2
#1.2 一共有多少个等于 20 岁的人参加考试?
scala> sc.textFile("/data/sparkwork.txt").collect.drop(1).map(_.split("\\s+")).filter(x=>x(2).toInt==20).groupBy(x=>x(1)).size
res11: Int = 2
#1.3 一共有多少个大于 20 岁的人参加考试?
scala> sc.textFile("/data/sparkwork.txt").collect.drop(1).map(_.split("\\s+")).filter(x=>x(2).toInt>20).groupBy(x=>x(1)).size
res12: Int = 2
#2. 一共有多个男生参加考试?
scala> sc.textFile("/data/sparkwork.txt").collect.drop(1).map(_.split("\\s+")).filter(x=>x(3)=="男").groupBy(x=>x(1)).size
res15: Int = 4
#2.1 一共有多少个女生参加考试?
scala> sc.textFile("/data/sparkwork.txt").collect.drop(1).map(_.split("\\s+")).filter(x=>x(3)=="女").groupBy(x=>x(1)).size
res16: Int = 2
#3. 12 班有多少人参加考试?
scala> sc.textFile("/data/sparkwork.txt").collect.drop(1).map(_.split("\\s+")).filter(x=>x(0)=="12").groupBy(x=>x(1)).size
res19: Int = 3
#3.1 13 班有多少人参加考试?
scala> sc.textFile("/data/sparkwork.txt").collect.drop(1).map(_.split("\\s+")).filter(x=>x(0)=="13").groupBy(x=>x(1)).size
res20: Int = 3
#4. 语文科目的平均成绩是多少?
scala> val x = sc.textFile("/data/sparkwork.txt").collect.drop(1).map(_.split("\\s+")).filter(x=>x(4)=="chinese").map(x=>x(5).toInt)
x: Array[Int] = Array(50, 50, 70, 60, 50, 70)
scala> x.sum/x.size
res54: Int = 58
#4.1 数学科目的平均成绩是多少?
scala> val x = sc.textFile("/data/sparkwork.txt").collect.drop(1).map(_.split("\\s+")).filter(x=>x(4)=="math").map(x=>x(5).toInt)
x: Array[Int] = Array(60, 50, 70, 60, 60, 80)
scala> x.sum/x.size
res55: Int = 63
#4.2 英语科目的平均成绩是多少?
scala> val x = sc.textFile("/data/sparkwork.txt").collect.drop(1).map(_.split("\\s+")).filter(x=>x(4)=="english").map(x=>x(5).toInt)
x: Array[Int] = Array(70, 50, 70, 70, 50, 70)
scala> x.sum/x.size
res56: Int = 63
#5. 单个人平均成绩是多少?
scala> sc.textFile("/data/sparkwork.txt").collect.drop(1).map(_.split("\\s+")).map(x=>(x(1),x(5))).groupBy(_._1).map(x=>(x._1,x._2.map(x=>x._2.toInt).sum/x._2.size))
res20: scala.collection.immutable.Map[String,Int] = Map(李大四 -> 53, 王芳 -> 70, 张大三 -> 63, 李四 -> 50, 王小芳 -> 73, 张三 -> 60)
#6. 12 班平均成绩是多少?
#求出总成绩/人数
scala> val x = sc.textFile("/data/sparkwork.txt").collect.drop(1).map(_.split("\\s+")).filter(x=>x(0)=="12").groupBy(x=>x(1))
x: scala.collection.immutable.Map[String,Array[Array[String]]] = Map(张三 -> Array(Array(12, 张三, 25, 男, chinese, 50), Array(12, 张三, 25, 男, math, 60), Array(12, 张三, 25, 男, english, 70)), 王芳 -> Array(Array(12, 王芳, 19, 女, chinese, 70), Array(12, 王芳, 19, 女, math, 70), Array(12, 王芳, 19, 女, english, 70)), 李四 -> Array(Array(12, 李四, 20, 男, chinese, 50), Array(12, 李四, 20, 男, math, 50), Array(12, 李四, 20, 男, english, 50)))
scala> x.flatMap(x=>(x._2.map(x=>x(5).toInt))).sum/x.size
res29: Int = 180
#6.1 12 班男生平均总成绩是多少?
#求出男生总成绩/男生人数
scala> val x = sc.textFile("/data/sparkwork.txt").collect.drop(1).map(_.split("\\s+")).filter(x=>x(0)=="12" && x(3)=="男").groupBy(x=>x(1))
x: scala.collection.immutable.Map[String,Array[Array[String]]] = Map(张三 -> Array(Array(12, 张三, 25, 男, chinese, 50), Array(12, 张三, 25, 男, math, 60), Array(12, 张三, 25, 男, english, 70)), 李四 -> Array(Array(12, 李四, 20, 男, chinese, 50), Array(12, 李四, 20, 男, math, 50), Array(12, 李四, 20, 男, english, 50)))
scala> x.flatMap(x=>(x._2.map(x=>x(5).toInt))).sum/x.size
res30: Int = 165
#6.2 12 班女生平均总成绩是多少?
#求出女生总成绩/女生人数
scala> val x = sc.textFile("/data/sparkwork.txt").collect.drop(1).map(_.split("\\s+")).filter(x=>x(0)=="12" && x(3)=="女").groupBy(x=>x(1))
x: scala.collection.immutable.Map[String,Array[Array[String]]] = Map(王芳 -> Array(Array(12, 王芳, 19, 女, chinese, 70), Array(12, 王芳, 19, 女, math, 70), Array(12, 王芳, 19, 女, english, 70)))
scala> x.flatMap(x=>(x._2.map(x=>x(5).toInt))).sum/x.size
res31: Int = 210
#7. 全校语文成绩最高分是多少?
scala> sc.textFile("/data/sparkwork.txt").collect.drop(1).map(_.split("\\s+")).filter(x=>x(4)=="chinese").map(x=>x(5).toInt).max
res32: Int = 70
#7.1 12 班语文成绩最低分是多少?
scala> sc.textFile("/data/sparkwork.txt").collect.drop(1).map(_.split("\\s+")).filter(x=>x(4)=="chinese" && x(0)=="12").map(x=>x(5).toInt).min
res33: Int = 50
#7.2 13 班数学最高成绩是多少?
scala> sc.textFile("/data/sparkwork.txt").collect.drop(1).map(_.split("\\s+")).filter(x=>x(4)=="math" && x(0)=="13").map(x=>x(5).toInt).max
res34: Int = 80
#8. 总成绩大于 150 分的 12 班的女生有几个?
scala> sc.textFile("/data/sparkwork.txt").collect.drop(1).map(_.split("\\s+")).filter(x=>x(3)=="女" && x(0)=="12").map(x=>(x(1),x(5))).groupBy(_._1).filter(x=>x._2.map(x=>x._2.toInt).sum>150).size
res40: Int = 1
#客户中的前5个最大家族
scala> sc.textFile("/data/customers.csv").map(_.split(",")).collect.map(x=>(x(1),x(2))).groupBy(_._2).map(x=>(x._1,x._2.size)).toList.sortBy(-_._2).take(5)
res34: List[(String, Int)] = List(("Smith",4626), ("Johnson",76), ("Williams",69), ("Jones",65), ("Brown",62))
#客户中的前10个最流行的名字
scala> sc.textFile("/data/customers.csv").map(_.split(",")).collect.map(x=>(x(1),x(2))).groupBy(_._1).map(x=>(x._1,x._2.size)).toList.sortBy(-_._2).take(10)
res35: List[(String, Int)] = List(("Mary",4741), ("James",135), ("John",118), ("Robert",117), ("David",114), ("Michael",111), ("William",98), ("Richard",76), ("Joseph",72), ("Elizabeth",71))
# 找出有没有同名的客户?
sc.textFile("file:///data/customers.csv").map(_.split(",")).map(x=>x(1)+x(2)).map((_,1)).reduceByKey(_+_).filter(_._2>1).collect
#统计客户中的地域分布
#1.读取csv文件
val df = spark.read.format("csv").option("header","false").option("delimiter",",").load("file:///data/customers.csv").toDF("id","fname","lname","email","password","street","city","state","zipcode")
#选取有效字段
val df2 = df.select("street","city","state")
#注册临时表
df2.registerTempTable("customers")
#进行sql查询
df2.sqlContext.sql("select distinct state ,count(1) over(partition by state),city ,count(1) over(partition by city),street,count(1) over(partition by street)from customers").show
csv文件格式如下: