1. 程式人生 > >Hive實現資料抽樣的常用三種方法

Hive實現資料抽樣的常用三種方法

背景

在大規模資料量的資料分析及建模任務中,往往針對全量資料進行挖掘分析時會十分耗時和佔用叢集資源,因此一般情況下只需要抽取一小部分資料進行分析及建模操作。
Hive提供了資料取樣(SAMPLING)的功能,能夠根據一定的規則進行資料抽樣,目前支援資料塊抽樣,分桶抽樣和隨機抽樣,具體如下所示:

1、隨機抽樣(rand()函式)

(1)使用rand()函式進行隨機抽樣,limit關鍵字限制抽樣返回的資料,其中rand函式前的distribute和sort關鍵字可以保證資料在mapper和reducer階段是隨機分佈的
 例子:隨機取表app.table_name並且日期是當天(datekey='2018-11-14')100條資料
 select * from app.table_name where datekey='2018-11-14' distribute by rand() sort by rand() limit 100;  

(2)千萬級資料中進行隨機抽樣 order by方式耗時更長
 例子:隨機取表100條資料
 select * from app.table_name order by rand() limit 100;
 
2、資料塊抽樣(tablesample()函式) 
1) tablesample(n percent) 根據hive表資料的大小按比例抽取資料,並儲存到新的hive表中。如:抽取原hive表中10%的資料 
(注意:測試過程中發現,select語句不能帶where條件且不支援子查詢,可通過新建中間表或使用隨機抽樣解決) 
create table xxx_new as select * from xxx tablesample(10 percent) 
2)tablesample(n M) 指定抽樣資料的大小,單位為M。 
3)tablesample(n rows) 指定抽樣資料的行數,其中n代表每個map任務均取n行資料,map數量可通過hive表的簡單查詢語句確認(關鍵詞:number of mappers: x)

3、分桶抽樣 

hive中分桶其實就是根據某一個欄位Hash取模,放入指定資料的桶中,比如將表table_1按照ID分成100個桶,其演算法是hash(id) % 100,這樣,hash(id) % 100 = 0的資料被放到第一個桶中,hash(id) % 100 = 1的記錄被放到第二個桶中。建立分桶表的關鍵語句為:CLUSTER BY語句。 
分桶抽樣語法: 
TABLESAMPLE (BUCKET x OUT OF y [ON colname]) 
其中x是要抽樣的桶編號,桶編號從1開始,colname表示抽樣的列,y表示桶的數量。 
例如:將表隨機分成10組,抽取其中的第一個桶的資料 
select * from table_01 tablesample(bucket 1 out of 10 on rand())

4、總結

聚合和抽樣,特別是聚合函式,在大資料處理過程中是處理資料的主要方法。通過自由的條件限制以及聚合函式組合,基本能完成任意要求的資料處理或分組,隨機抽樣、資料塊抽樣、分桶抽樣 是三種比較常見的資料抽樣方式。