對於非常大的資料集,使用者不需要全部查詢的結果,只需要乙個代表性的查詢結果時,可以通過對錶進行分桶抽樣。
hive分桶表
先介紹一下hive桶。
桶是比表或分割槽更為細粒度的資料範圍劃分。針對某一列進行桶的組織,對列值雜湊,然後除以桶的個數求餘,決定將該條記錄存放到哪個桶中。
好處:
1、獲得更高的查詢處理效率。
2、使抽樣更高效。
建立帶桶的table:
create
table bucketed_user(id int ,name string) clustered by (id) into
4 buckets row format delimited fields terminated by
'\t' stored as textfile;
string) clustered by (id) sorted by (name) into
4 buckets;
檢視目錄,發現已經有了bucketed_users這個目錄
hive> dfs -ls /user/hive/warehouse;
found 4 items
drwxrwxr-x
- mahao supergroup 0
2016-09
-1322:59 /user/hive/warehouse/bucketed_users
drwxrwxr-x
- mahao supergroup 0
2016-09
-1201:58 /user/hive/warehouse/employees
drwxrwxr-x
- mahao supergroup 0
2016-09
-0820:04 /user/hive/warehouse/src
drwxrwxr-x
- mahao supergroup 0
2016-09
-0722:26 /user/hive/warehouse/test
桶中的資料根據name列進行排序,在對每個桶進行連線時變成了高效的歸併排序。
hive不檢測資料檔案中的桶是否和表定義中的桶一致(桶數或劃分桶的列),如果不匹配,會在查詢時出錯,所以,建議讓hive來劃分桶的操作。
向表中插入資料
物理上,乙個桶就是表(或分割槽)目錄裡的乙個檔案。桶對應於mapreduce的輸出檔案分割槽:乙個作業產生的桶(輸出檔案)和reduce任務個數相同。
在向分桶表載入資料時,需要先
set hive.enforce.bucketing=true;(hive2.0好像沒有這個引數)
這樣hive就知道用表定義中宣告的數量來建立桶,然後使用insert載入資料即可。
先準備乙個沒有劃分桶的表users。
hive> select * from users;
ok1 zhangsan
2 lisi
3 wangwu
向分桶表中插入資料:
insert overwrite table bucketed_users select * from users;
檢視表結構:
mahao@ubuntu:~$ hadoop fs -ls /user/hive/warehouse/bucketed_users
found 4 items
-rwxrwxr
-x1 mahao supergroup 0
2016-09
-1323:36 /user/hive/warehouse/bucketed_users/000000_0
-rwxrwxr
-x1 mahao supergroup 11
2016-09
-1323:36 /user/hive/warehouse/bucketed_users/000001_0
-rwxrwxr
-x1 mahao supergroup 7
2016-09
-1323:36 /user/hive/warehouse/bucketed_users/000002_0
-rwxrwxr
-x1 mahao supergroup 9
2016-09
-1323:36 /user/hive/warehouse/bucketed_users/000003_0
發現有四個檔案,即四個桶。
檢視檔案:
mahao@ubuntu
:~$ hadoop fs -cat /user/hive/warehouse/bucketed_users/*0_0;
mahao@ubuntu
:~$ hadoop fs -cat /user/hive/warehouse/bucketed_users/*1_0;
1zhangsan
mahao@ubuntu
:~$ hadoop fs -cat /user/hive/warehouse/bucketed_users/*2_0;
2lisi
mahao@ubuntu
:~$ hadoop fs -cat /user/hive/warehouse/bucketed_users/*3_0;
3wangwu
因為不會顯示分隔符,所以看著就是挨著的。
抽樣查詢
hive>select * from bucketed_users tablesample(bucket 1
outof
2on id);
2 lisi
注:tablesample是抽樣語句,語法:tablesample(bucket x out of y)
y必須是table總bucket數的倍數或者因子。hive根據y的大小,決定抽樣的比例。例如,table總共分了64份,當y=32時,抽取(64/32=)2個bucket的資料,當y=128時,抽取(64/128=)1/2個bucket的資料。x表示從哪個bucket開始抽取。例如,table總bucket數為32,tablesample(bucket 3 out of 16),表示總共抽取(32/16=)2個bucket的資料,分別為第3個bucket和第(3+16=)19個bucket的資料。
分桶及分桶抽樣查詢
1.先建立普通表 2.在建立分桶表 1 create table 表名 字段 型別,clustered by 根據分桶的字段 into 分桶數 buckets row format delimited fields terminated by 根據什麼分割 create table stu buck...
Hive知識點 索引 分割槽表 分桶表 抽樣查詢
在指定列上建立索引,會產生一張索引表 hive的一張物理表 裡面的字段包括,索引列的值 該值對應的hdfs檔案路徑 該值在檔案中的偏移量 將表中的資料,分散到表目錄下的多個子目錄 分割槽目錄 中 目的在執行查詢時只查詢某些子目錄中的資料加快查詢效率 匯入資料時候需要指定向哪個分割槽匯入資料 相當於在...
hive分桶表join Hive分桶表
測試資料 95001,李勇,男,20,cs 95002,劉晨,女,19,is 95003,王敏,女,22,ma 95004,張立,男,19,is 95005,男,18,ma 95006,孫慶,男,23,cs 95007,易思玲,女,19,ma 95008,李娜,女,18,cs 95009,夢圓圓,女...