SparkSQL的编程题

一、题目:

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

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

使用SparkSQL完成

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

数据如下:

3,朔州区,朔城区,五菱,小型普通客车,非运营,1
3,晋城区,城区,东风,小型普通客车,非运营,1
12,长治市,长治城区,北京,小型普通客车,非运营,1
12,长治市,长治城区,东风,小型普通客车,非运营,1
12,长治市,长治城区,东风,小型普通客车,非运营,1
12,长治市,长治城区,东风,小型普通客车,非运营,1
12,长治市,长治城区,航天,小型普通客车,非运营,1
12,长治市,长治城区,航天,小型普通客车,非运营,1
12,长治市,长治城区,航天,小型普通客车,非运营,1
12,长治市,长治城区,航天,小型普通客车,非运营,1
12,长治市,长治城区,航天,小型普通客车,非运营,1
12,长治市,长治城区,航天,小型普通客车,非运营,1
12,长治市,长治城区,航天,小型普通客车,非运营,1
12,长治市,长治城区,航天,小型普通客车,非运营,1
12,长治市,长治城区,航天,小型普通客车,非运营,1
12,长治市,长治城区,航天,小型普通客车,非运营,1
12,长治市,长治城区,航天,小型普通客车,非运营,1
12,长治市,长治城区,航天,小型普通客车,非运营,1
12,长治市,长治城区,航天,小型普通客车,非运营,1
12,长治市,长治城区,航天,小型普通客车,非运营,1

 代码:

//创建文本
vim car.txt
//上传文本
hdfs dfs -put car.txt /

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

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

  

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

 

 

3.表头信息
scala> import org.apache.spark.sql.types._

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))

 

 

4.表格信息
scala> import org.apache.spark.sql._

val carsRDD = carRDD.map{line => val fields = line.split(",");
Row(fields(0).toInt,fields(1),fields(2),fields(3),fields(4),fields(5),fields(6).toInt)
}

 

 

5.拼接
scala> import spark.implicits._

scala> val st = StructType(str)

scala> val carDataFrame = spark.createDataFrame(carsRDD,st)

 

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

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

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

上面构建DataFrame
直接创建临时表
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.先统计各城市各区县的汽车销量
select city,county,sum(quantity) c from cars group by city,county

2.最大的区县
spark.sql("select a.city,a.county,max(a.c) from (
select city,county,sum(quantity) c from cars group by city,county
)a group by a.city,a.county").show

 

 

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

1.1-12月非运营车辆中各个品牌的销量排序
spark.sql("select brand,sum(quantity) c from car where month between 1 and 6 and nature = '非运营' group by brand order by c

2.求在前三名
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

 

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lambda-小张

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值