從Hive表中進行資料抽樣 Sampling

2021-07-31 22:50:05 字數 2162 閱讀 9795

在hive中提供了資料取樣(sampling)的功能,用來從hive表中根據一定的規則進行資料取樣,hive中的資料取樣支援分桶表取樣和資料塊取樣。

根據輸入的inputsize,取樣n%。

比如:輸入大小為1g,tablesample (50 percent)將會取樣512m的資料;

看例子:

表lxw1總大小約為64816816,總記錄數為:2750714

使用下面的語句,從表lxw111中取樣50%的資料,建立乙個新錶:

create table lxw1234 as

select * from lxw1 tablesample (50 percent);

完成後看看表lxw1234的記錄數和大小:

結果表記錄數:1376390,總大小:32432626,基本上是原表的50%。

這種方式指定取樣資料的大小,單位為m。

比如,下面的語句:

create table lxw1234_2 as

select * from lxw1 tablesample (30m);

將會從表lxw1中取樣30m的資料:

這種方式可以根據行數來取樣,但要特別注意:這裡指定的行數,是在每個inputsplit中取樣的行數,也就是,每個map中都取樣n rows。

下面的語句:

select count(1) from (select * from lxw1 tablesample (200 rows)) x;

有5個map task(inputsplit),每個取樣200行,一共1000行。

關於hive中的分桶表(bucket table),在以後的文章中將會介紹,其實就是根據某乙個欄位hash取模,放入指定資料的桶中,比如將表lxw1234按照id分成100個桶,其算 法是hash(id) % 100,這樣,hash(id) % 100 = 0的資料被放到第乙個桶中,hash(id) % 100 = 1的記錄被放到第二個桶中。分桶表在建立時候使用cluster by語句建立。

hive中分桶表取樣的語法是:

table_sample: tablesample (bucket x out of y [on colname])

其中x是要抽樣的桶編號,桶編號從1開始,colname表示抽樣的列,y表示桶的數量。

例子1:

select count(1)

from lxw1 tablesample (bucket 1 out of 10 on rand());

該語句表示將表lxw1隨機分成10個桶,抽樣第乙個桶的資料;

前面介紹過,表lxw1總大小約為64816816,總記錄數為:2750714

出來的結果基本上是原表的十分之一,注意:這個結果每次執行是不一樣的,因為是按照隨機數進行分桶取樣的。

例子2:

如果基於乙個已經分桶表進行取樣,將會更有效率。

執行下面的語句,建立乙個分桶表,並插入資料:

create table lxw1_bucketed (pcid string)

clustered by(pcid) into 10 buckets;

insert overwrite table lxw1_bucketed

select pcid from lxw1;

表lxw1_bucketed按照pcid欄位分成10個桶,下面的語句表示從10個桶中抽樣第乙個桶的資料:

select count(1) from lxw1_bucketed tablesample(bucket 1 out of 10

on pcid);

很好理解。

再看這個:

select count(1) from lxw1_bucketed tablesample(bucket 1 out of 20

on pcid)

表只有10個桶,如果指定20,看結果:

結果差不多是源表記錄的1/20,hive在執行時候,會在第乙個桶中抽樣一半的資料。

還有一點:

如果從源表中直接分桶抽樣,也能達到一樣的效果,比如:

select count(1) from lxw1 tablesample(bucket 1 out of 20 on pcid);

區別在於基於已經分桶的表抽樣,查詢只會掃瞄相應桶中的資料,而基於未分桶表的抽樣,查詢時候需要掃瞄整表資料,先分桶,再抽樣。

其它更詳細的用法請參考hive的官方文件說明。

Hive進行資料抽樣 隨機抽取

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

使用hive進行資料開發

3 1 hive環境搭建 啟動 hive 3 2 hive helloworld 檢視所有資料庫 show databases 進入default資料庫 use default 檢視資料庫中所有表 show tables 檢視表結構 desc table name 刪除表 drop table db...

android開發中進行資料儲存與訪問

怎樣在android開發中進行資料儲存與訪問 資料儲存與訪問 很多時候我們的軟體需要對處理後的資料進行儲存或再次訪問。android為資料儲存提供了多種方式,分別有如下幾種 檔案sharedpreferences sqlite資料庫 內容提供者 content provider 網路android有...