Hive常用函式和分桶表
Hive常用函式和分桶表
一、字串常用函式
二、分桶表
分桶操作是更細粒度的分配方式,一張表可以同時分割槽和分桶,分桶的原理是根據指定的列的計算hash值模餘分桶數量後將資料分開存放。
Hive的分桶實際上就是Hadoop的分割槽,有幾個桶,就用幾個reduce任務來處理。
需要注意的是:分桶表必須是內部表。因為只有在建立表的時候才能指定桶的數量,然後在往表裡插入資料的時候,會按照指定的分割槽欄位(列欄位)做分桶。
實現步驟:
1.建立帶桶的 table :
create table teacher(class string) clustered by (class) into 3 buckets row format delimited fields terminated by ‘\t’;
2.開啟分桶機制:
set hive.enforce.bucketing=true;
3.往表中插入資料:
insert overwrite table teacher select * from b1;//需要提前準備好temp,從temp查詢資料寫入到teacher。
注:teacher是一個分桶表,對於分通表,不允許以外部檔案方式匯入資料,只能從另外一張表資料匯入。
4.查看錶的結構,會發現當前表下有三個檔案:
dfs -ls /user/hive/warehouse/teacher;
5.讀取資料,看一個檔案的資料:
dfs -cat /user/hive/warehouse/teacher/000000_0;
注:桶使用 hash 來實現,所以每個檔案擁有的資料的個數都有可能不相等。
6.對桶中的資料進行取樣:
select * from teacher tablesample(bucket 1 out of 3 on class);
注:分桶語法—TABLESAMPLE(BUCKET x OUT OF y)
y必須是table總bucket數的倍數或者因子。hive根據y的大小,決定抽樣的比例。
x表示從哪個bucket開始抽取。
例如:table總bucket數為3,tablesample(bucket 3 out of 3),表示總共抽取(3/3=)1個bucket的資料,抽取第3個bucket的資料。
再例如:table總bucket數為32,tablesample(bucket 3 out of 16),表示總共抽取(32/16=)2個bucket的資料,分別為第3個bucket和第(3+16=)19個bucket的資料。
7.查詢第一個桶裡資料,並返回一半的資料:
select * from bucketed_user tablesample(bucket 1 out of 6 on id);