一、實驗背景介紹
大數據計算服務(MaxCompute,原名 ODPS)是一種快速、完全託管的 GB/TB/PB 級數據倉庫解決方案。MaxCompute 向用戶提供了完善的數據導入方案以及多種經典的分佈式計算模型,能夠更快速的解決用戶海量數據計算問題,有效降低企業成本,並保障數據安全。本實驗結合實際數據和案例,深入淺出的演示瞭如何使用MaxCompute的內置函數。
完成此實驗後,可以掌握的內置函數有:
- 窗口函數;
2. 聚合函數;
3. 其他函數;
二、實驗環境架構
實驗環境架構:阿里雲大數據計算服務MaxCompute
第 1 章:實驗準備
1.1 申請MaxCompute資源
請點擊頁面左側的 ,在左側欄中,查看本次實驗資源信息。 maxcompute申請MaxCompute資源 MAXCOMPUTE 在彈出的左側欄中,點擊 創建資源 按鈕,開始創建實驗資源。 資源創建過程需要1-3分鐘。完成實驗資源的創建後,用戶可以通過 實驗資源 查看實驗中所需的資源信息,例如:阿里雲賬號等。
1.2 開通服務
(本實驗用到odps客戶端,創建資源之前確保本地安裝了java8或者以上版本) Java下載地址:https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html 1)點擊【實驗資源】,查看本次實驗資源信息(MaxCompute資源)。 2)在彈出的左側欄中,點擊 【創建資源】按鈕,開始創建實驗資源。 如下圖:
注意:實驗環境一旦開始創建則進入計時階段,建議學員先基本瞭解實驗具體的步驟、目的,真正開始做實驗時再進行創建。 3)創建資源,如下圖:(創建資源需要幾分鐘時間,請耐心等候……) 4)資源創建成功後,可通過【實驗資源】查看實驗中所需的實驗資源信息。如下圖:
注意:在本地保存下阿里雲賬號信息,包括資源中的項目名稱、企業別名、子用戶名稱、子用戶密碼、AK ID、AK Secret等信息。 沙箱實驗環境說明:
企業別名:即主賬號ID;
子用戶名稱和子用戶密碼:登錄實驗環境的賬號;
AK ID和AK Secret:系統爲當前用戶分配的登錄驗證密鑰信息,配置odps客戶端時需要;
控制檯url:登錄實驗開發環境的地址; 5)點擊頁面左側的【控制檯url】,複製鏈接,在新的窗口打開,跳轉到登錄頁。 6)在登錄頁,輸入【實驗資源】中提供的賬號,格式爲:子用戶名稱@企業別名,再點擊【下一步】。 7)輸入【實驗資源】中提供的的“子用戶密碼”,點擊【登錄】 8)登陸後,進入【管理控制檯】界面, 點擊左側菜單欄 【大數據(數加)】,再點擊【DataWorks】,進入數據開發概覽頁。
1.3 創建項目
沙箱環境已經默認創建完項目,點擊【進入數據開發】即可。 本小節以下步驟供使用個人賬號實驗參考。
開通MaxCompute後,點擊【管理控制檯】 選中MaxCompute服務,選擇【按量付費】,然後點擊【下一步】 填寫項目相關信息:輸入“項目名稱”(全局唯一)、“顯示名”以及“項目描述” 信息,然後點擊【創建項目】。 項目創建成功後,點擊【進入數據開發】:】 打開【數據開發】頁面:
1.4 安裝配置odpscmd客戶端
步驟1:客戶端下載 (本實驗已經提供好客戶端,自行下載附件)
步驟2:解壓odpscmd_public.zip 到本地目錄,密碼:aca21104 如:解壓至E:\ODPS_DEMO
步驟3:查看本次實驗課用到的介質,可以看到如下的文件夾: 步驟4:在conf文件夾中有odps_config.ini文件。鼠標右鍵編輯此文件,配置相關信息:
說明:
project_name=<對應實驗資源中的項目名稱>
access_id=<對應實驗資源中的AK ID>
access_key=<對應實驗資源中的AK Secret>
end_point=http://service.odps.aliyun.com/api(默認)
tunnel_endpoint=http://dt.odps.aliyun.com (默認)
log_view_host=http://logview.odps.aliyun.com(默認)
https_check=true (默認)
步驟5:修改好配置文件後,鼠標雙擊運行bin目錄下的odpscmd(在Linux系統下是./bin/odpscmd,Windows下運行./bin/odpscmd.bat),現在可以運行 MaxCompute 命令,如: 注意:項目可以隨時根據情況切換,上圖表示環境設置成功.
1.5 測試表dual準備
在【臨時查詢】頁面,點擊【新建】,然後點擊【QDPS SQL】 輸入“節點名稱”,選擇“目標文件夾”,然後點擊【提交】。 進入腳本編輯頁面,進行腳本開發,創建實驗測試表dual,點擊【運行】。
SQL語句:
CREATE TABLE dual (
id BIGINT
)
LIFECYCLE 10000;
然後查看運行日誌日誌顯示測試表創建成功。 往測試表裏插入一條數據,輸入SQL語句,點擊【運行】。
insert into table dual select count(1) from dual;
查看測試表數據內容,輸入SQL語句,點擊【運行】。:
select * from dual limit 10;
1.6 測試表t_dml準備
進入腳本編輯頁面,進行腳本開發,創建實驗測試表t_dml,點擊【運行】
create table t_dml (
detail_id bigint,
sale_date datetime,
province string,
city string,
product_id bigint,
cnt bigint,
amt double
);
然後查看運行日誌顯示測試表創建成功。 打開odpscmd客戶端交互界面 執行命令,加載數據 t_dml.csv,(注意修改數據文件存放路徑):
tunnel upload f:\data\t_dml.csv t_dml; 查看數據表數據:輸入sql語句,點擊【運行】,查看結果。
select * from t_dml limit 10;
1.7 測試表t_product準備
進入腳本編輯頁面,進行腳本開發,創建實驗測試表t_product,點擊【運行】。
create table t_product
(product_id bigint, product_name string, category_id bigint, category_name string, price double);
然後查看運行日誌顯示測試表創建成功。 打開odpscmd客戶端交互界面 加載數據 t_product.csv,注意文件路徑:
tunnel upload f:\data\t_product.csv t_product; 查看數據表數據,輸入sql,點擊【運行】。
select * from t_product limit 10;
1.8 測試表t_sign準備
進入腳本編輯頁面,進行腳本開發,創建實驗測試表t_sign,點擊【運行】。
create table t_sign (id bigint, name string, height double, is_female boolean, birth_day datetime);
測試表創建成功 進入odpscmd客戶端交互界面 執行命令,加載數據 t_sign.csv:
tunnel upload f:\data\t_sign.csv t_sign;
查看數據表數據,輸入sql, 點擊【運行】
select * from t_sign limit 10;
第 2 章:實驗詳情
2.1 窗口函數
(1) 統計量類:
根據5月份銷售數據,統計出日銷量波動最小的產品(即標準差最小) 。在【臨時查詢】工作區,點擊【新建QDPS SQL】,輸入相關信息,然後點擊【提交】 輸入腳本,點擊【運行】,查看結果
select product_id,stddev(amt)over(partition by product_id) std_dev
from (select datetrunc(sale_date,'dd') as dt, product_id, sum(amt) as amt
from t_dml
group by datetrunc(sale_date,'dd'), product_id) t1
order by std_dev limit 1;
(2) 排名類:
根據5月份銷售數據,統計出同一產品成交最短時間間隔(以產品1爲例,列出兩次成交時間差最小的記錄)。
select datediff(t1.sale_date, t2.sale_date, 'ss') dt_diff,
t1.detail_id, t2.detail_id
from (select row_number()over(partition by product_id order by sale_date)
as id, * from t_dml where product_id=1
and datetrunc(sale_date,'mm')='2015-05-01 00:00:00') t1
join (select row_number()over(partition by product_id order by sale_date) as id, *
from t_dml where product_id=1
and datetrunc(sale_date,'mm')='2015-05-01 00:00:00') t2
on t1.id = t2.id+1 order by dt_diff limit 1;
輸入腳本,點擊【運行】,查看結果
(3) 帶 rows 的開窗:
在做時序分析(Time Series Analysis)時,對於長期趨勢(Trend)的分析最常見的是使用移動平均法(Moving Average method),是通過逐期移動時間序列,並計算一系列擴大時間間隔後的序時平均數,最終形成一個新時間序列的方法。優點是由其它因素而引起的變動影響被削弱了,對原序列起到了修勻的作用,從而更清晰地呈現出現象的變動趨勢。通常MA是由專業的挖掘算法來實現,我們可以嘗試使用帶rows的開窗函數來實現:
以4天作爲一個平滑窗口的寬度(前2後1),即取n-2天到n+1天作爲一個平滑窗口,計算連續四天內的均值作爲第n天的代表值。對產品1和產品2的銷售金額和銷售量進行平穩化。做趨勢圖,分別做橫向(不同產品的趨勢圖)和縱向(同一產品平滑前後的趨勢圖)比較。
select dt, product_id, avg(amt) over(partition by product_id order by dt rows between 2
preceding and 1 following),
avg(cnt) over(partition by product_id order by dt rows between 2
preceding and 1 following)
from (select to_char(sale_date,'yyyymmdd') as dt, product_id,
sum(cnt) as cnt, sum(amt) as amt
from t_dml where product_id in (1,2)
group by to_char(sale_date,'yyyymmdd'),product_id) t;
輸入腳本,點擊【運行】,查看結果
2.2 聚合函數
(1) 統計量類:
給出銷售信息表t_dml中的不同產品的銷售金額的基本統計信息。
select product_id, count(*), min(amt), max(amt), sum(amt), avg(amt),
median(amt), stddev(amt), stddev_samp(amt)
from t_dml
group by product_id;
輸入腳本,點擊【運行】,查看結果 (2) 字符串類:
將產品標稱單價在50-100元的,生成一個清單,不同產品名稱之間用|分隔開。
select wm_concat('|',product_name)
from t_product where price >=50 and price<=100;
輸入腳本,點擊【運行】,查看結果
2.3 其他函數
(1) COALESCE 處理NULL值:
將 t_sign 中的名字(name)和生日(birth_day)拼成一個串
select concat(coalesce(name,'unknown'),coalesce(birth_day,'unknown'))
from t_sign;
輸入腳本,點擊【運行】,查看結果 (2) decode 分支函數
將銷售記錄t_dml中浙江、上海和北京的銷量單獨統計出來:
select decode(province,'浙江省', '浙', '上海市', '滬', '北京市', '京','其他'),
sum(cnt)
from t_dml
group by decode(province,'浙江省','浙', '上海市', '滬', '北京市', '京','其他');
輸入腳本,點擊【運行】,查看結果 (3) ordinal 有序位置函數:
順序統計量(Ordered Statistics,也稱次序統計量)是非參統計的重要組成部分,適用於整體分佈不能由有限個參數表示的情況。利用ordinal函數,可以方便的計算順序統計相關的一些基礎統計量:
最小順序統計量 X(1),最大順序統計量 X(n),極差 R=X(n) -X (1) ,四分衛極差:
IQL= X(0.75n) -X (0.25n)
select ordinal(8,1,2,3,4,6,5,8,7,9,0)- ordinal(3,1,2,3,4,6,5,8,7,9,0) as IQL
from dual;
輸入腳本,點擊【運行】,查看結果
(4) sample 採樣函數:
通過採樣分析的手段,從銷售記錄表t_dml中得到1/100的數據,分析採樣樣本,試着推斷總體的銷售金額的平均值、標準差、極值、極差等,然後從總體中計算出這些統計量進行驗證。調整採樣比例,重複上述推斷過程,找到一個準確程度和樣本體量的平衡點,進一步思考:這個平衡點有多大參考價值?
// 1/100比例的樣本的推斷值
select avg(amt) as Average,stddev_samp(amt) as Standard_Dev,
min(amt) as Min_Val, max(amt) as Max_Val,
max(amt) - min(amt) as Range_Val,count(*) as Sample_size
from (select amt from t_dml where sample(100,1,detail_id)=true) t;
// 1/10比例的樣本的推斷值
select avg(amt) as Average,stddev_samp(amt) as Standard_Dev,
min(amt) as Min_Val, max(amt) as Max_Val,
max(amt) - min(amt) as Range_Val,count(*) as Sample_size
from (select amt from t_dml where sample(10)=true) t; //總體實際值
select avg(amt) as Average,stddev_samp(amt) as Standard_Dev,
min(amt) as Min_Val, max(amt) as Max_Val,
max(amt) - min(amt) as Range_Val,count(*) as Sample_size
from t_dml;
輸入腳本,點擊【運行】,查看結果
第 3 章:實驗總結
3.1 實驗總結
MaxCompute的這幾類函數基本覆蓋了我們日常工作的絕大多數數據處理需求。通過靈活熟練的使用這些函數,
可以提升開發效率,若仍有無法滿足的需求,還可以考慮自定義函數。
第 4 章:課後任務
4.1 課後任務
1、根據t_dml表,統計輸出各個省成交額最大的城市及其成交額
2、根據t_dml表,統計輸出各個城市有交易的天數及其平均成交額
3、根據t_product表,輸出各類別下價格最大的產品及其價格