スパークSQL演習


データ取得:リンク:https://pan.baidu.com/s/1XcHKF50aEHrB_hPRfTb0vQ抽出コード:76nd

1.環境要件

  • Hadoop + Hive + Spark + HBase開発環境。

2.データの説明

1.データの背景

  • データは毎日収集され、要約されます。データは主要な省(香港、マカオ、台湾、チベット、海南)の180を超える大規模な農産物卸売市場、および380を超える農産物のカテゴリー(季節的および地域的な特性により、毎日のデータには必ずしも含まれない場合があります)すべての農産物カテゴリー)。

2.データ型

  • 農産物products.txtの卸売市場価格データ
中国語の名前 英語名 データのタイプ
農産物名(1列目) 名前 ストリング
卸売価格(列2) 価格 ダブル
取得時間(列3) craw_time ストリング
卸売市場名(列4) 市場 ストリング
都道府県(列5) ストリング
市(列6) ストリング

3.機能要件(RDDとSpark SQLをそれぞれ使用するために必要)

1.農産物市場の数に関する統計

  • 1)各州の農産物市場の総数を数える
    ここに画像の説明を挿入

  • 2)農産物市場のない州の統計
    ここに画像の説明を挿入

2.農産物の種類に関する統計

  • 1)農産物の種類の数に応じて、上位3州を数える
    ここに画像の説明を挿入

  • 2)農産物の種類の数に応じて、各州の上位3つの農産物市場を数える
    ここに画像の説明を挿入

3.価格間隔統計、山西省の各農産物の価格変動傾向を計算、つまり1日の平均価格を計算し、結果をコンソールに出力する

  • 特定の農産物の平均価格を計算する式:
  • PAVG =(PM1 + PM2 +…+PMn-max§-min§)/(N-2)
  • このうち、Pは価格、Mnは農産物市場である市場です。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