首先我們的資料來源如下:
tbdate這張表記錄的是時間資訊;
tbstockdetail這張表記錄的訂單的詳細資訊;
tbstock這張表將訂單與實踐和地點兩個維度的資訊連線在一起。
資料屬性如下:
每個訂單可能包含多個貨品,每個訂單可以產生多次交易,不同的貨品有不同的單價。也就是說:
tbstock與tbstockdetail是一對多的關係,ordernumber與itemid是一對多的關係
載入資料
資料存放於txt檔案中;用sparkcontext提供的textfile方法一行一行地將書讀出,封裝為case類,建立乙個rdd。再將這個包含case類的rdd轉換成dataset,在dataset的基礎上,建立檢視
建立case類
case讀入資料class tbdate(dateid:string,//
日期 years:string,//
年月 theyear:int,//
年 month:int,//
月 day:int,//
天 weekday:int,//
周天 week:int,//
周 quarter:int,//
季度 period:int,//
旬 halfmonth:int)//
半月//
訂單號,位置id,時期id
case
class
tbstock(ordernumber:string,locationid:string,dateid:string)
//訂單號,行號?,貨品id,數量,**,銷售額
case
class tbstockdetail(ordernumber:string, rownum:int, itemid:string, number:int, price:double, amount:double)
這裡將資料的讀入**抽取出來封裝為三個方法,在主類中呼叫這三個方法
object登錄檔readfromfile ")
//封裝成tbdate物件
tbdate(
words(
0).trim(),
words(
1).trim(),
words(
2).trim.toint,
words(
3).trim.toint,
words(
4).trim.toint,
words(
5).trim.toint,
words(
6).trim.toint,
words(
7).trim.toint,
words(
8).trim.toint,
words(
9).trim.toint)}
}.tods()
tbdateds.show()
tbdateds
} def readstock(spark:sparksession,path:string) : dataset[tbstock] =")
tbstock(words(
0).trim, words(1).trim, words(2
).trim)
}}.tods()
tbstockds.show()
tbstockds
} def readstockdetail(spark:sparksession,path:string) : dataset[tbstockdetail] =")
tbstockdetail(
words(
0).trim,
words(
1).trim.toint,
words(
2).trim,
words(
3).trim.toint,
words(
4).trim.todouble,
words(
5).trim.todouble)}
}.tods()
dbstockdeatilds.show
dbstockdeatilds
}}
//計算所有訂單中每年的銷售單數、銷售總額查詢涉及到的字段有年份theyear,count(distinct ordernumber),sum(amount),而且是以年份來分組;然後建立dataset
val tbdateds: dataset[tbdate] = readfromfile.readdate(spark, "
e:/idea/spark3/in/tbdate.txt")
val tbstockds: dataset[tbstock] = readfromfile.readstock(spark, "
e:/idea/spark3/in/tbstock.txt")
val tbstockdetailds: dataset[tbstockdetail] = readfromfile.readstockdetail(spark, "
e:/idea/spark3/in/tbstockdetail.txt")
//登錄檔
tbdateds.createorreplacetempview("
datetable")
tbstockds.createorreplacetempview(
"stocktable")
tbstockdetailds.createorreplacetempview(
"stockdetailtable
")
sql語句如下:
/*計算所有訂單每年最大金額訂單的銷售額最後要得出的字段有將三個表進行連線,並按照年份來分組
count(ordernumber)得到銷售單數
sum(amount)得到銷售總額
*/val sql1 = "
select c.theyear, count(distinct a.ordernumber), sum(b.amount) from
" + "
stocktable a join stockdetailtable b on a.ordernumber = b.ordernumber
" + "
join datetable c on a.dateid = c.dateid
" + "
group by c.theyear
" + "
order by c.theyear
"spark.sql(sql1).show
年份,訂單號,銷售額
比如在2023年,訂單b的銷售額達到2000,是最大的;
比如在2023年,訂單d的銷售額達到4000,是最大的;
第一步,查詢出三個字段:某個訂單在某個年份的銷售總額是多少
比如:訂單a在2023年銷售總額是1000
訂單b在2023年銷售總額是2000
訂單c在2023年銷售總額是3000
訂單d在2023年銷售總額是4000
第二步,以年份為分組,在分組內求最大值
sql語句如下:
val sql2 = "select a.ordernumber,c.theyear,sum(b.amount) as sumofamount from
" + "
stocktable a join stockdetailtable b on a.ordernumber = b.ordernumber
" + "
join datetable c on a.dateid = c.dateid
" + "
group by a.ordernumber,c.theyear
"spark.sql(sql2).createorreplacetempview(
"tmpofsumyear");
val sql3 = "select * from tmpofsumyear a where sumofamount = " +"(select max(sumofamount) from tmpofsumyear where theyear = a.theyear group by theyear)"
spark.sql(sql3).show()計算所有訂單中每年最暢銷的貨品也就是找出每年銷售額最大的貨品,即為年度最暢銷貨品。由於這個需求與上乙個高度雷同,僅僅把訂單id改成貨品id就可實現。所以不再討論。
坑:
1)在匯入資料的時候,要注意資料的格式,比如錯誤的空格、空行,會導致莫名其妙的問題。
2)關於group by語句引發的語法錯誤,見部落格
3)注意在建表的時候,要避開一些資料庫中的關鍵字,比如表名為order,欄位為year。
Spark SQL程式設計實戰案例
spark sql程式設計實戰案例 一.spark sql程式設計之dataframe篇 博主推薦閱讀 二.spark sql程式設計之dataset篇 博主推薦閱讀 三.dataframe與dataset的互操作 root hadoop101.yinzhengjie.org.cn vim tmp ...
6 案例 人臉案例
1 得到影象的特徵後,訓練乙個決策樹構建的adaboost級聯決策器來識別是否為人臉 2 opencv中自帶已訓練好的檢測器,包括面部,眼睛,貓臉等,都儲存在xml檔案中,我們可以通過以下程式找到他們 主程式如下 import cv2 as cv import matplotlib.pyplot a...
10案例分析
銀行 信用風險,即客戶違約風險,是銀行風險管控的主要內容。不同行業,不同企業,財務指標的風險程度不同。假資料,假資訊,假報表的現象,財務資訊的質量問題有三個方面是非常重要的 1.建立識別假報表的管理體系 2.研究建立財務資訊的勾稽關係,即通過相互之間的購機關係的檢驗來判別資料的質量 3.建立資料的錄...