Hive 隨機取樣 抽樣查詢

2021-10-03 11:22:34 字數 2360 閱讀 5272

在大規模資料量的資料分析及建模任務中,往往針對全量資料進行挖掘分析時會十分耗時和占用集群資源,因此一般情況下只需要抽取一小部分資料進行分析及建模操作

hive提供了資料取樣(sampling)的功能,能夠根據一定的規則進行資料抽樣,目前支援資料塊抽樣分桶抽樣隨機抽樣,具體如下所示:

隨機抽樣(rand()函式)

select

*'2018-11-14' distribute by rand(

) sort by rand(

)limit

100;

select

*by rand(

)limit

100;

2、資料塊抽樣(tablesample()函式)

1) tablesample(n percent) 根據hive表資料的大小按比例抽取資料,並儲存到新的hive表中。如:抽取原hive表中10%的資料 ,該方式允許hive隨機抽取n行資料,資料總量的百分比(n百分比)或n位元組的資料。

語法:

select

*from

tablesample(n percent

|bytelengthliteral|n rows

) s;

(注意:測試過程中發現,select語句不能帶where條件且不支援子查詢,可通過新建中間表或使用隨機抽樣解決)

create

table ***_new as

select

*from *** tablesample(

10percent

)

3、資料塊抽樣(block sampling )

例:按資料量百分比抽樣

select name from employees tablesample(

10percent

) a;

例:按資料大小取樣

select name from employees tablesample(

1m) a;

例:按資料行數取樣

select

*from source tablesample(

10rows

);

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

outof

10on rand(

))

該方式是最佳化取樣bucket表。rand()函式也可以用來取樣整行。如果取樣列同時使用了clustered by,使用tablesample語句會更有效率。

語法:

select

*from

tablesample(bucket

outof

on[colname|rand()]

) table_alias;

示例:

select

*from employees tablesample

(bucket

2outof4

onrand()

) table_alias;

select

*from ******_uid_online_buck tablesample

(bucket 1 out of 2 on uid)

;

4、總結

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

hive 隨機抽樣

1.random sampling syntax select from distribute by rand sort by rand limit 2.bucket table sampling 該方式是最佳化取樣bucket表。rand 函式也可以用來取樣整行。如果取樣列同時使用了cluster...

使用Hive隨機抽樣

test1 簡單隨機抽樣 select t.varx,t.a from select varx,rand a from tablename t where t.a between 0 and 0.2這樣就抽取了五分之一的資料。或者像這樣隨機抽取100條資料,與limit結合使用 select dis...

Hive進行資料抽樣 隨機抽取

3.hive隨機抽取 4.mysql隨機抽樣 原來的50 select from liyang tablesample 50percent 30m select from liyang tablesample 30m 200行 每個map200行 select from liyang tablesa...