• SparkSQL的编程题


    一、题目:

    现有一份汽车销售记录,销售记录月、市、区县、品牌、车辆类型、使用性质和数量7列

    按步骤完成如下操作(建议在Spark-shell中完成):

    使用SparkSQL完成

    ​ (1)将汽车销售记录上传至HDFS;

    数据如下:

    1. 3,朔州区,朔城区,五菱,小型普通客车,非运营,1
    2. 3,晋城区,城区,东风,小型普通客车,非运营,1
    3. 12,长治市,长治城区,北京,小型普通客车,非运营,1
    4. 12,长治市,长治城区,东风,小型普通客车,非运营,1
    5. 12,长治市,长治城区,东风,小型普通客车,非运营,1
    6. 12,长治市,长治城区,东风,小型普通客车,非运营,1
    7. 12,长治市,长治城区,航天,小型普通客车,非运营,1
    8. 12,长治市,长治城区,航天,小型普通客车,非运营,1
    9. 12,长治市,长治城区,航天,小型普通客车,非运营,1
    10. 12,长治市,长治城区,航天,小型普通客车,非运营,1
    11. 12,长治市,长治城区,航天,小型普通客车,非运营,1
    12. 12,长治市,长治城区,航天,小型普通客车,非运营,1
    13. 12,长治市,长治城区,航天,小型普通客车,非运营,1
    14. 12,长治市,长治城区,航天,小型普通客车,非运营,1
    15. 12,长治市,长治城区,航天,小型普通客车,非运营,1
    16. 12,长治市,长治城区,航天,小型普通客车,非运营,1
    17. 12,长治市,长治城区,航天,小型普通客车,非运营,1
    18. 12,长治市,长治城区,航天,小型普通客车,非运营,1
    19. 12,长治市,长治城区,航天,小型普通客车,非运营,1
    20. 12,长治市,长治城区,航天,小型普通客车,非运营,1

     代码:

    1. //创建文本
    2. vim car.txt
    3. //上传文本
    4. hdfs dfs -put car.txt /

    ​ (2)使用编程方式定义RDD模式,提取月、市、区县、品牌、车辆类型、使用性质和数量7列,并定义相应Schema;

    1. 1.读取rdd文件
    2. scala> val carRDD = sc.textFile("/car.txt")

      

    1. 2.查看是否读取成功
    2. scala> carRDD.collect.foreach(println)

     

     

    1. 3.表头信息
    2. scala> import org.apache.spark.sql.types._
    3. scala> val str = Array(StructField("month",IntegerType),StructField("city",StringType),StructField("county",StringType),StructField("brand",StringType),StructField("catType",StringType),StructField("nature",StringType),StructField("quantity",IntegerType))

     

     

    1. 4.表格信息
    2. scala> import org.apache.spark.sql._
    3. val carsRDD = carRDD.map{line => val fields = line.split(",");
    4. Row(fields(0).toInt,fields(1),fields(2),fields(3),fields(4),fields(5),fields(6).toInt)
    5. }

     

     

    1. 5.拼接
    2. scala> import spark.implicits._
    3. scala> val st = StructType(str)
    4. scala> val carDataFrame = spark.createDataFrame(carsRDD,st)

     

    ​ (3)将(2)的结果以json格式保存至HDFS;

    carDataFrame.write.format("json").save("/car.json")

    ​ (4)读取该json文件,构建DataFrame;

    1. 上面构建DataFrame
    2. 直接创建临时表
    3. carDataFrame.createOrReplaceTempView("car")

    ​ (5)在DataFrame中使用SQL语句实现如下查询:

    ​ ① 统计各汽车品牌的销量,并按销量从高到低排序;

    spark.sql("select brand,sum(quantity) c from car group by brand order by c desc").show

     

    ​ ② 统计各月各汽车品牌的销量;

    spark.sql("select brand,month,sum(quantity) c from car group by brand,month").show
    

     

    ​ ③ 统计各市的汽车销量,并按销量从低到高排序;

    spark.sql("select city,sum(quantity) c from car group by city order by c").show
    

     

     

    ​ ④ 统计不同城市不同车辆类型的销量;

    spark.sql("select city,catType,sum(quantity) c from car group by city,catType").show

      

    ​ ⑤ 统计各城市汽车销量最大的区县;

    1. 1.先统计各城市各区县的汽车销量
    2. select city,county,sum(quantity) c from cars group by city,county
    3. 2.最大的区县
    4. spark.sql("select a.city,a.county,max(a.c) from (
    5. select city,county,sum(quantity) c from cars group by city,county
    6. )a group by a.city,a.county").show

     

     

    ​ ⑥ 统计1~12月非运营车辆销量最大的前2大品牌。

    1. 1.1-12月非运营车辆中各个品牌的销量排序
    2. spark.sql("select brand,sum(quantity) c from car where month between 1 and 6 and nature = '非运营' group by brand order by c
    3. 2.求在前三名
    4. spark.sql("select a.brand,a.c from (select brand,sum(quantity) c from car where month between 1 and 12 and nature = '非运营' group by brand order by c desc) a limit 2").show

     

  • 相关阅读:
    Linux 调试之strace
    位图BiMap
    640. 求解方程(JavaScript)
    新火种AI|微软扶持下一个OpenAI?Mistral AI新模型对标GPT-4,上线即挤爆
    常见的加密方式都有哪些
    Java线程池ThreadPoolExecutor详解(一篇就够了)
    java劳务外包管理系统springboot+vue
    C#根据DataTable中的不同值为asp:DataGrid中的不同行或单元格设置不同的颜色
    Java面向对象(基础)-- 类的成员之三:构造器(Constructor)
    搭建django后端api,前后端分离,可跨域,带管理员后台和商品模型(耗时10分钟)
  • 原文地址:https://blog.csdn.net/m0_55834564/article/details/125535669