Hive 隨機取樣-抽樣查詢

背景

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

  1. 隨機抽樣(rand()函數)
  • 使用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;  
  • 千萬級數據中進行隨機抽樣 order by方式耗時更長(不可取)
    例子:隨機取表100條數據
 select * from app.table_name order by rand() limit 100;

2、數據塊抽樣(tablesample()函數)

1) tablesample(n percent) 根據hive表數據的大小按比例抽取數據,並保存到新的hive表中。如:抽取原hive表中10%的數據 ,該方式允許Hive隨機抽取N行數據,數據總量的百分比(n百分比)或N字節的數據。
語法:

SELECT * FROM <Table_Name> TABLESAMPLE(N PERCENT|ByteLengthLiteral|N ROWS) s;

(注意:測試過程中發現,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、數據塊抽樣(Block sampling )

例:按數據量百分比抽樣

SELECT name FROM employees TABLESAMPLE(10 PERCENT) a;

例:按數據大小採樣

SELECT name FROM employees TABLESAMPLE(1M) a;

例:按數據行數採樣

SELECT * FROM source TABLESAMPLE(10 ROWS);

3、桶表抽樣(Bucket table sampling)

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())

該方式是最佳化採樣bucket表。RAND()函數也可以用來採樣整行。如果採樣列同時使用了CLUSTERED BY,使用TABLESAMPLE語句會更有效率。
語法:

SELECT * FROM <Table_Name> TABLESAMPLE(BUCKET <specified bucket number to sample> OUT OF <total number of buckets> ON [colname|RAND()]) table_alias;

示例:

SELECT * FROM employees TABLESAMPLE(BUCKET 2 OUT OF 4 ON RAND()) table_alias;
SELECT * FROM xxxxxx_uid_online_buck TABLESAMPLE(bucket 1 out of 2 on uid); 

4、總結

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章