RDD综合训练

题目: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)
  }
}

运行结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值