题目:qm2.txt数据,每一行数据代表一次购买东西的记录,每一行的数据格式:年,月,买的东西,中间字段使用空格分隔。
实验要求:统计2015年上半年(1-6月)购买最多的东西。
qm2.txt:
2015 1 手机
2015 2 电脑
2015 3 书包
2015 4 笔
2015 5 笔
2015 6 笔
2015 7 书
2015 8 书
2015 9 零食
2015 10 书
2016 1 书
2016 2 书
2016 3 笔
2016 6 书
2016 8 书包
2016 9 手机
代码:
package com.atguigu.shiyan15
import org.apache.spark.api.java.JavaRDD.fromRDD
import org.apache.spark.{SparkConf, SparkContext}
import org.apache.spark.rdd.RDD
import org.apache.spark.sql.{DataFrame, Row, SparkSession}
import org.apache.spark.storage.StorageLevel
object No3 {
case class Person(thing:String, month:String, year:Int)
def main(args: Array[String]): Unit = {
val sparConf = new SparkConf().setMaster("local").setAppName("WordCount")
val sc = new SparkContext(sparConf)
val sparkConf = new SparkConf().setMaster("local[*]").setAppName("sparkSQL")
val ss = SparkSession.builder().config(sparkConf).getOrCreate()
//读取文件,获取一行一行的数据(textFile)
val lines: RDD[String] = sc.textFile("datas/qm2.txt")
// lines.collect().foreach(println)
import ss.implicits._
val RDDPerson = lines.map(_.split(" ")).map(p => Person(p(2),p(1),p(0).trim.toInt))
val DFPerson = RDDPerson.toDF()
val df: DataFrame = DFPerson.select($"year",$"month",$"thing")
df.createOrReplaceTempView("user")
val frame: DataFrame = ss.sql("SELECT * FROM user\nWHERE year='2015'\nAND month < 7;")
// frame.show
val line: RDD[Row] = frame.rdd
val line1 = line.rdd.map(_.mkString(" "))
// line1.collect().foreach(println)
//将原始数据进行结构的转换。方便统计(map)
val mapRDD= line1.map(
line => {
val datas = line.split(" ")
(( datas(2) ), 1) //索引,只取第三列‘买的东西’
})
//将转换结构后的数据,进行分组聚合
val wordToSum: RDD[(String, Int)] = mapRDD.reduceByKey((x, y) => {
x + y
})
wordToSum.persist(StorageLevel.DISK_ONLY) //方法2 持久化数据仅保存在磁盘上
//按照点击次数进行降序排序(sortBy)
val group: RDD[(String, Int)] = wordToSum.sortBy(t => t._2,false)
//取前一(take)
val tup: Array[(String, Int)] = group.take(1)
//采集打印在控制台
print("2015年上半年(1-6月)购买最多的东西: ")
tup.foreach(println)
}
}
运行结果: