對於每乙個表(table)或者分割槽(partition), hive可以進一步組織成桶,也就是說桶是更為細粒度的資料範圍劃分。hive也是 針對某一列進行桶的組織。hive採用對列值雜湊,然後除以桶的個數求餘的方式決定該條記錄存放在哪個桶當中。
把錶(或者分割槽)組織成桶(bucket)有兩個理由:
(1)獲得更高的查詢處理效率。桶為表加上了額外的結構,hive 在處理有些查詢時能利用這個結構。具體而言,連線兩個在(包含連線列的)相同列上劃分了桶的表,可以使用 map 端連線 (map-side join)高效的實現。比如join操作。對於join操作兩個表有乙個相同的列,如果對這兩個表都進行了桶操作。那麼將儲存相同列值的桶進行join操作就可以,可以大大較少join的資料量。
(2)使取樣(sampling)更高效。在處理大規模資料集時,在開發和修改查詢的階段,如果能在資料集的一小部分資料上試執行查詢,會帶來很多方便。
下面來乙個例子:
id bigint comment』編號』,(ps:comment為注釋)
name
string comment』姓名』
)comment』編號與姓名表』
partitioned by(pdate string)
clustered by(id) 按id分桶,自動雜湊分桶
sorted by(id) 按id排序
into 4 buckets 分成4個桶
row format delimited 設定建立的表在載入資料的時候,支援的列分隔符
fields terminated by 『\t』 每個欄位按\t分割
lines terminated by』\n』 stored as textfile; 按\n為斷行符,指定匯入的檔案為純文字。
hive本身支援的檔案格式只有:text file,sequence file,如果資料需要壓縮,使用 [stored as sequence]
夠詳細了吧,下面load資料:
插入資料之前需要設定引數hive.enforce.bucketing=true,以強制hive的reducer數目為分桶數。如果不設定這個hive引數,最後的桶個數可能不是建表語句中的個數。另外,也可以通過將引數mapred.reduce.tasks設定為桶的數目來控制reducer的數目,建議採用第一種方式。
set hive.enforce.bucketing=true;
load data local inpath』/home/hadoop/….』 overwrite into
table dz_test partition(pdate=『2015-10』)
物理上,每個桶就是表(或分割槽)目錄裡的乙個檔案。它的檔名並不重要,但是桶 n 是按照字典序排列的第 n 個檔案。事實上,桶對應於 mapreduce 的輸出檔案分割槽:乙個作業產生的桶(輸出檔案)和reduce任務個數相同。
我們可以通過檢視剛才 建立的bucketd_users表的布局來了解這一情況。執行如下命令:
檢視表的結構:
hive> dfs -ls /user/hive/warehouse/dz_test;
將顯示有4個新建的檔案。檔名如下(檔名包含時間戳,由hive產生,因此 每次執行都會改變):
attempt_201701221636_0016_r_000000_0
attempt_201701221636_0016_r-000001_0
attempt_201701221636_0016_r_000002_0
attempt_201701221636_0016_r_000003_0
第乙個桶裡包括使用者id和4,因為乙個int的雜湊值就是這個整數本身,在這裡 除以桶數(4)以後的餘數:2
讀取資料,看每乙個檔案的資料:
hive> dfs -cat /user/hive/warehouse/dz_test/*0_0;
0 nat
4 ann
用tablesample子句對錶進行取樣,我們可以獲得相同的結果。這個子句會將 查詢限定在表的一部分桶內,而不是使用整個表:
. 對桶中的資料進行取樣:
hive> select * from dz_test
>tablesample(bucket 1 out of
4on id);
0 nat
4 ann
桶的個數從1開始計數。因此,前面的查詢從4個桶的第乙個中獲取所有的使用者。 對於乙個大規模的、均勻分布的資料集,這會返回表中約四分之一的資料行。我們 也可以用其他比例對若干個桶進行取樣(因為取樣並不是乙個精確的操作,因此這個 比例不一定要是桶數的整數倍)。例如,下面的查詢返回一半的桶:
7. 查詢一半返回的桶數:
hive> select * from dz_test
> tablesample(bucket 1 out of
2on id);
0 nat
4 ann
2 joe
因為查詢只需要讀取和tablesample子句匹配的桶,所以取樣分桶表是非常高效 的操作。如果使用rand()函式對沒有劃分成桶的表進行取樣,即使只需要讀取很 小一部分樣本,也要掃瞄整個輸入資料集:
hive〉 select * from dz_test
> tablesample(bucket 1 out of
4on rand());
2 doe
①從hive 0.6
.0開始,對以前的版本,必須把mapred.reduce .tasks設為表中要填 充的桶的個數。如果桶是排序的,還需要把hive.enforce.sorting設為true。
②顯式原始檔案時,因為分隔字元是乙個不能列印的控制字元,因此欄位都擠在一起。
hive分桶 hive學習筆記之五 分桶
分割槽欄位的每個值都會建立乙個資料夾,值越多資料夾越多 不合理的分割槽會導致有的資料夾下資料過多,有的過少 set hive.enforce.bucketing true 如果不執行上述設定,您需要自行設定mapred.reduce.tasks引數,以控制reducers數量,本文咱們配置為hive...
hive 修改分桶數 分桶表 Hive中的分桶
對於每乙個表 table 或者分割槽,hive可以進一步組織成桶,也就是說桶是更為細粒度的資料範圍劃分。hive也是針對某一列進行桶的組織。hive採用對列值雜湊,然後除以桶的個數求餘的方式決定該條記錄存放在哪個桶當中。把錶 或者分割槽 組織成桶 bucket 有兩個理由 1 獲得更高的查詢處理效率...
Hive分桶筆記
分桶表與其他表的區別 分桶表是從別的表查詢的資料在insert到分桶表中 而其他表是load clustered by id into 4 buckets 通過id hash雜湊 建立分桶表 create table stu buck sno int,sname string,string,sage...