hive中有關分桶

2021-09-24 22:04:10 字數 1478 閱讀 9830

首先,在hive中為什麼要分桶??

:單個分割槽或者表中的資料量越來越大,當分割槽不能更細粒度的劃分資料時,

會採用分桶的技術將資料更加細粒度的劃分和管理。

分割槽和分桶的區別:

分割槽:乙個分割槽在表目錄之中就是目錄下的乙個檔案,在表中的字段因為是偽列,所以定義分割槽的時候應該加上

對應的字段型別。例如:

create table table_test(id int,name string)partitioned by(date string);
分桶:乙個表或者分割槽,都可以進一步組織成桶,也就是說桶是更為細粒度劃分、hive中的分桶採用了對列

雜湊,然後除以桶的個數求餘的方式決定該條記錄放在哪個桶表中。例如:

create table bucketed_table (id int ,name string)clustered by (id) sorted  by (name) into 4 buckets row format

delimited fields terminated by '\t' stored as textfile;

分桶的重點函式:tablesample抽樣語句,

答:y 必須是 x 的倍數或者因子,hive 根據 y 的大小,決定抽樣的比例。例如,table 總共有64份,當y等於32的時候,抽取

(64/32=2)2個busket的資料,當y等於128的時候,抽取(64/128=1/2)個bucket的資料。x表示從哪個bucket開始抽取。

例如:table 的bucket數為32,tablesample(bucket 3 out of 16),表示一共抽取2個bucket資料,分別是3和16個bucket中的資料。

select * from bucketed_table tablesample(bucket x out of y on id);
分桶表的資料載入:

load data local inpath '/root/user/tablefile' into table bucket_table;

?不可以使用load data 載入,否則不會進行分桶,即使設定了強制分桶屬性和reduce的個數。

只能建立臨時表,insert into的形式進行載入。

結論:

1、想要達到分桶的效果,只能insert into的方式進行載入,且只需要設定:

hive.enforce.bucketing=true引數即可,與設定set mapreduce.job.reduces=4;引數無關。

2.桶的概念就是mapreduce中分割槽的概念,兩者完全相同。物理上每個桶就是目錄裡的乙個檔案,

乙個作業產生的桶(輸出檔案)數量和reduce任務個數相同。

3.而分割槽表的概念,是新概念,分割槽代表的資料的倉庫,也就是資料夾目錄,每個資料夾下面可以放不同

的資料檔案,通過資料夾可以查詢裡面存放的檔案,但資料夾本身和資料的內容毫無關係。

hive 修改分桶數 分桶表 Hive中的分桶

對於每乙個表 table 或者分割槽,hive可以進一步組織成桶,也就是說桶是更為細粒度的資料範圍劃分。hive也是針對某一列進行桶的組織。hive採用對列值雜湊,然後除以桶的個數求餘的方式決定該條記錄存放在哪個桶當中。把錶 或者分割槽 組織成桶 bucket 有兩個理由 1 獲得更高的查詢處理效率...

hive分桶 hive學習筆記之五 分桶

分割槽欄位的每個值都會建立乙個資料夾,值越多資料夾越多 不合理的分割槽會導致有的資料夾下資料過多,有的過少 set hive.enforce.bucketing true 如果不執行上述設定,您需要自行設定mapred.reduce.tasks引數,以控制reducers數量,本文咱們配置為hive...

Hive分桶筆記

分桶表與其他表的區別 分桶表是從別的表查詢的資料在insert到分桶表中 而其他表是load clustered by id into 4 buckets 通過id hash雜湊 建立分桶表 create table stu buck sno int,sname string,string,sage...