spark sql练习


数据获取:链接: https://pan.baidu.com/s/1XcHKF50aEHrB_hPRfTb0vQ 提取码: 76nd

一、环境要求

  • Hadoop+Hive+Spark+HBase 开发环境。

二、数据描述

1、数据背景

  • 该数据每日进行采集汇总。数据范围涵盖全国主要省份(港澳台、西藏、海南暂无数据)的 180+的大型农产品批发市场,380+的农产品品类(由于季节性和地域性等特点,每日的数据中不一定会涵盖全部的农产品品类)。

2、数据类型

  • 农产品批发市场价格数据products.txt
中文名称 英文名称 数据类型
农产品名称(列 1) name String
批发价格(列 2) price Double
采集时间(列 3) craw_time String
批发市场名称(列 4) market String
省份(列 5) province String
城市(列 6) city String

三、功能要求(要求使用分别使用 RDD 和 Spark SQL 两种方式实现)

1、农产品市场个数统计

  • 1)统计每个省份的农产品市场总数
    在这里插入图片描述

  • 2)统计没有农产品市场的省份有哪些
    在这里插入图片描述

2、农产品种类统计

  • 1)根据农产品类型数量,统计排名前 3 名的省份
    在这里插入图片描述

  • 2)根据农产品类型数量,统计每个省份排名前 3 名的农产品市场
    在这里插入图片描述

3、价格区间统计,计算山西省每种农产品的价格波动趋势,即计算每天价格均值,并将结果输出到控制台上

  • 某种农产品的价格均值计算公式:
  • PAVG = (PM1+PM2+…+PMn-max§-min§)/(N-2)
  • 其中,P 表示价格,Mn 表示 market,即农产品市场。PM1 表示 M1 农产品市场的该产品价格,max§表示价格最大值,min§价格最小值。

在这里插入图片描述

case class Product(productName:String,price:String,craw_time:String,market:String,province:String,city:String)
//转化rdd
val rdd = sc.textFile("file:///data/products.txt")
//定义schema信息
import org.apache.spark.sql.Row
import org.apache.spark.sql.types.{
    
    StructType, StructField, StringType}
val schemaString = "productName price craw_time market province city"
val fields = schemaString.split("\\s+").map(fieldName => StructField(fieldName, StringType, nullable = true))
val schema = StructType(fields)
val rowRDD = rdd.map(_.split("\\s+")).filter(_.size==6).map(x => Row(x(0), x(1),x(2),x(3), x(4),x(5)))
val pdf = spark.createDataFrame(rowRDD, schema)
pdf.printSchema()
pdf.createOrReplaceTempView("products")
//1、农产品市场个数统计
//1)统计每个省份的农产品市场总数
//sql
spark.sql("select province,count(distinct market) from products group by province").show
//rdd
rdd.map(_.split("\\s+")).filter(_.size==6).map(x=>(x(4),x(3))).groupByKey.map(x=>(x._1,x._2.toArray.distinct.size)).collect
//2)统计没有农产品市场的省份有哪些
case class Province(province:String,nickName:String)
val pdf2 = sc.textFile("file:///data/allprovinces.txt").map(_.split("\\s+")).map(x=>Province(x(0),x(1))).toDF
pdf2.createOrReplaceTempView("province")
spark.sql("with t1 as (select p1.province,p1.nickName,p2.market from province p1 left join products p2 on p1.province=p2.province) select * from t1 where t1.market is null ").show()
//2、农产品种类统计
//1)根据农产品类型数量,统计排名前 3 名的省份
spark.sql("select province,count(distinct productName) c from products group by province order by c desc").show(3)
//2)根据农产品类型数量,统计每个省份排名前 3 名的农产品市场
spark.sql("with t1 as(select province,market,count(distinct productName) c from products group by province,market) ,t2 as(select t1.*,row_number() over(partition by province order by t1.c desc) as rank from t1) select t2.* from t2 where t2.rank<=3").show(10000)
/*
3、价格区间统计,计算山西省每种农产品的价格波动趋势,即计算每天价格均值,并将
结果输出到控制台上。
某种农产品的价格均值计算公式:
PAVG = (PM1+PM2+...+PMn-max(P)-min(P))/(N-2)
其中,P 表示价格,Mn 表示 market,即农产品市场。PM1 表示 M1 农产品市场的该
产品价格,max(P)表示价格最大值,min(P)价格最小值。
*/
spark.sql("select productName,if(count(1)>2,round((sum(price)-max(price)-min(price))/(count(1)-2)),round(sum(price)/count(1))) as avgPriceDay from products where province = '山西' group by productName").show(10000)

猜你喜欢

转载自blog.csdn.net/sun_0128/article/details/107964128