1. 程式人生 > >Hive常用函式和分桶表

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