1. 程式人生 > >Hive分割槽和分桶

Hive分割槽和分桶

Hive把表組織成分割槽(partition)。這是一種根據分割槽列(partition column,如日期)的值對錶進行粗略的劃分機制。使用分割槽可以加快資料分片(slice)的查詢速度。

表或分割槽可以進一步劃分為(bucket)。它會為資料提供額外的結構以獲取更高效的查詢處理。例如,通過根據使用者ID來劃分桶,我們可以在所有使用者集合的隨機樣本上快速計算基於使用者的查詢。

分桶適用場景:

資料抽樣( sampling )、map-join

  1. 建立分割槽表

hive> CREATE TABLE pt1(id INT,name STRING,hobby ARRAY<STRING>,address MAP<STRING,STRING>)

    > PARTITIONED BY(dt STRING,country STRING)

    > ROW FORMAT DELIMITED FIELDS TERMINATED BY ','

    > COLLECTION ITEMS TERMINATED BY '-'

    > MAP KEYS TERMINATED BY ':';

OK

Time taken: 0.196 seconds

hive> show tables;

OK

pt1

Time taken: 0.063 seconds, Fetched: 1 row(s)

說明:我們可以看到建立分割槽表和之前建立表的唯一區別就是多了Partitioned By,如果要建立一個分割槽那麼裡面就寫一個欄位、我們這裡演示的是建立多個(兩個)分割槽。

在WEB UI中檢視

檢視一下表格式:

hive> desc formatted pt1;

OK

# col_name             data_type            comment             

id                   int                                      

name                 string                                   

hobby                array<string>                            

address              map<string,string>                       

# Partition Information   

# col_name             data_type            comment             

dt                   string                                   

country              string                                   

# Detailed Table Information    

Database:            htest                 

Owner:               root                  

CreateTime:          Sat Aug 04 15:16:34 CST 2018  

LastAccessTime:      UNKNOWN               

Protect Mode:        None                  

Retention:           0                     

Location:            hdfs://mycluster/user/hive/warehouse/htest.db/pt1  

Table Type:          MANAGED_TABLE         

Table Parameters:    

transient_lastDdlTime 1533366994          

# Storage Information    

SerDe Library:       org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe  

InputFormat:         org.apache.hadoop.mapred.TextInputFormat  

OutputFormat:        org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat  

Compressed:          No                    

Num Buckets:         -1                    

Bucket Columns:      []                    

Sort Columns:        []                    

Storage Desc Params:    

colelction.delim     -                   

field.delim          ,                   

mapkey.delim         :                   

serialization.format ,                   

Time taken: 0.178 seconds, Fetched: 38 row(s)

可以看到分割槽資訊中多了兩個分割槽欄位

載入資料:

  1. 準備資料

id,name,hobby,address

1,張三,籃球-足球-音樂,北京:上海

2,李四,看書-旅遊-爬山,西安:成都

3,王五,鋼琴-小提琴-古箏,重慶:杭州

4,趙六,抽菸-喝酒-燙頭髮,哈爾濱:瀋陽

    2.載入資料

hive> LOAD DATA LOCAL INPATH '/root/data/hdata1' into table pt1;

FAILED: SemanticException [Error 10062]: Need to specify partition columns because the destination table is partitioned

如果還和之前一樣載入資料,顯然直接報錯,根據錯誤日誌很明顯看出,給分割槽表載入資料必須要指定分割槽列。

hive> LOAD DATA LOCAL INPATH '/root/data/hdata1' into table pt1

PARTITION(dt='2018-08-04',country='CHINA');

Loading data to table htest.pt1 partition (dt=2018-08-04, country=CHINA)

Partition htest.pt1{dt=2018-08-04, country=CHINA} stats: [numFiles=1, numRows=0, totalSize=207, rawDataSize=0]

OK

Time taken: 1.091 seconds

說明:我這次載入資料的時候把分割槽的日期欄位定義為dt='2018-08-04',國家欄位定義為country=CHINA,那麼這一批資料都屬於這個兩個分割槽;如果明天我要載入第二批資料的時候,那麼就把日期欄位和國家欄位進行相應的修改,這樣就可以很完美的把資料進行分割槽了。

檢視一下表中是資料:

hive> select * from pt1;

OK

NULL name ["hobby"] {"address":null} 2018-08-04 CHINA

1 張三 ["籃球","足球","音樂"] {"北京":"上海"} 2018-08-04 CHINA

2 李四 ["看書","旅遊","爬山"] {"西安":"成都"} 2018-08-04 CHINA

3 王五 ["鋼琴","小提琴","古箏"] {"重慶":"杭州"} 2018-08-04 CHINA

4 趙六 ["抽菸","喝酒","燙頭髮"] {"哈爾濱":"瀋陽"} 2018-08-04 CHINA

Time taken: 0.157 seconds, Fetched: 5 row(s)

在WEB UI中檢視,也能看到資料存在兩個分割槽列目錄中:

  1. 建立分桶表

hive> CREATE TABLE bt1(id INT,name STRING,hobby ARRAY<STRING>,address MAP<STRING,STRING>)

    > CLUSTERED BY(id) INTO 4 BUCKETS

    > ROW FORMAT DELIMITED FIELDS TERMINATED BY ','

    > COLLECTION ITEMS TERMINATED BY '-'

    > MAP KEYS TERMINATED BY ':';

OK

Time taken: 0.161 seconds

說明:分桶表是對列值取雜湊值的方式,將不同資料放到不同檔案中儲存。

對於hive中每一個表、分割槽都可以進一步進行分桶。

由列的雜湊值除以桶的個數來決定每條資料劃分在哪個桶中。

2.載入資料

(1)前提:

開啟支援分桶

set hive.enforce.bucketing=true;

預設:false;設定為true之後,mr執行時會根據bucket的個數自動分配reduce task個數。(使用者也可以通過mapred.reduce.tasks自己設定reduce任務個數,但分桶時不推薦使用)

注意:一次作業產生的桶(檔案數量)和reduce task個數一致。

(2)分桶載入資料和分割槽以及表的方式不一樣,不能使用LOAD,載入資料的方式有兩種:

insert into table bt1 select columns from pt1;

insert overwrite table bt1 select columns from pt1;

這裡我使用第二種:(把上面建立的分割槽表的資料匯入這個分通表)

INSERT OVERWRITE TABLE bt1 SELECT id,name,hobby,address from pt1;

匯入資料後檢視WEB UI:

可以看到的確分了四個桶,每個桶對應一個檔案

檢視這四個檔案:

[[email protected] ~]# hadoop fs -cat /user/hive/warehouse/htest.db/bt1/000000_1000

4,趙六,抽菸-喝酒-燙頭髮,哈爾濱:瀋陽

[[email protected] ~]# hadoop fs -cat /user/hive/warehouse/htest.db/bt1/000001_1001

1,張三,籃球-足球-音樂,北京:上海

[[email protected] ~]# hadoop fs -cat /user/hive/warehouse/htest.db/bt1/000002_1000

2,李四,看書-旅遊-爬山,西安:成都

[[email protected] ~]# hadoop fs -cat /user/hive/warehouse/htest.db/bt1/000003_1000

3,王五,鋼琴-小提琴-古箏,重慶:杭州

[[email protected] ~]#

相關推薦

Hive分割槽

Hive把表組織成分割槽(partition)。這是一種根據分割槽列(partition column,如日期)的值對錶進行粗略的劃分機制。使用分割槽可以加快資料分片(slice)的查詢速度。 表或分割槽可以進一步劃分為桶(bucket)。它會為資料提供額外的結構以獲取更高

能說一下你們專案中hive的庫表設計嗎---庫表設計三板斧---內外部表|分割槽|序列化反序列化

資料倉庫的起源可以追溯到計算機與資訊系統發展的初期。它是資訊科技長期複雜演化的產物,並且直到今天這種演化仍然在繼續進行著。而資料倉庫容易讓人糊塗的地方在於它是一種體系結構,而不是一種技術。這點使得許多技術人員和風投都感到沮喪,因為他們希望的是打好成包的專業技術,而非

hive的三板斧:內部表外部表、分割槽以及序列化/反序列化(SerDe)

hive的三板斧:內部表和外部表、分割槽和分桶以及序列化/反序列化(SerDe)   Hive是Hadoop生態圈中實現資料倉庫的一項技術。雖然Hadoop和HDFS的設計侷限了Hive所能勝任的工作,但是Hive仍然是目前網際網路中最適合資料倉庫的應用技術。 不論從“品相還是舉止

hive分割槽

1.Hive分割槽表 Hive使用select語句進行查詢的時候一般會掃描整個表內容,會消耗很多時間做沒必要的工作。Hive可以在建立表的時候指定分割槽空間,這樣在做查詢的時候就可以很好的提高查詢的效率。 建立分割槽表的語法: create table tablen

HIVE—索引、分割槽的區別

一、索引 Hive支援索引,但是Hive的索引與關係型資料庫中的索引並不相同,比如,Hive不支援主鍵或者外來鍵。 Hive索引可以建立在表中的某些列上,以提升一些操作的效率,例如減少MapReduce任務中需要讀取的資料塊的數量。 為什麼要建立索引? Hive的索引目的是

Hive SQL(分割槽)

1.HIVE 分割槽表 在 hive select 查詢中一般會掃描整個內容,消耗很多時間組沒必要的工作.有時候只需要掃描表中的一部分關心的資料,因此建表時引入了partition 概念. 分割槽表指的是在建立表時指定的partition的分割槽空間,Hive可以對資料按

HIVE分割槽以及的簡單概念

1、Hive 分割槽表 在Hive Select查詢中一般會掃描整個表內容,會消耗很多時間做沒必要的工作。有時候只需要掃描表中關心的一部分資料,因此建表時引入了partition概念。分割槽表指的是在建立表時指定的partition的分割槽空間。  Hive可以對資料按照某

HIVE 分割槽

//分割槽表,優化手段之一,從目錄的層面控制搜尋資料的範圍。     //建立分割槽表.     $hive>CREATE TABLE t3(id int,name string,age int) PARTITIONED BY (Year INT, Month INT)

第二十一天 -- hive補充 -- hive分割槽 -- hive資料匯入匯出

第二十一天 – hive補充 – hive分割槽、分桶 – hive資料匯入匯出 一、Hive基礎補充 使用的表及表資料 dept CREATE TABLE dept( deptno int, dname string, loc strin

Hive面試題:Hive分割槽表的區別

分割槽在HDFS上的表現形式是一個目錄, 分桶是一個單獨的檔案 分割槽:  細化資料管理,直接讀對應目錄,縮小mapreduce程式要掃描的資料量 分桶:   1、提高join查詢的效率(用分桶欄位做連線欄位)    

一起學Hive——建立內部表、外部表、分割槽表及匯入資料

Hive本身並不儲存資料,而是將資料儲存在Hadoop的HDFS中,表名對應HDFS中的目錄/檔案。根據資料的不同儲存方式,將Hive表分為外部表、內部表、分割槽表和分桶表四種資料模型。每種資料模型各有優缺點。通過create user命令建立user表時,會在HDFS中生成一個user目錄/檔案。 外部表

資料倉庫hive語句中的分割槽

    資料倉庫中從各資料來源獲取資料以及在資料倉庫內的資料轉換和流動都可以認為是ETL(抽取Extra,轉化Transfer,裝載Load)的過程,ETL是資料倉庫的流水線.資料倉庫(data warehouse)與資料庫的區別:資料倉庫(data warehouse)--

Hive 系列(五)—— Hive 分割槽

一、分割槽表 1.1 概念 Hive 中的表對應為 HDFS 上的指定目錄,在查詢資料時候,預設會對全表進行掃描,這樣時間和效能的消耗都非常大。 分割槽為 HDFS 上表目錄的子目錄,資料按照分割槽儲存在子目錄中。如果查詢的 where 字句的中包含分割槽條件,則直接從該分割槽去查詢,而不是掃描整個表目錄,合

HIVE—索引、的區別

處理 拆分 功能 分布 哈希函數 對比 part 一致性 進一步 一、索引 簡介 Hive支持索引,但是Hive的索引與關系型數據庫中的索引並不相同,比如,Hive不支持主鍵或者外鍵。 Hive索引可以建立在表中的某些列上,以提升一些操作的效率,例如減少MapRedu

Hive常用函式

Hive常用函式和分桶表 一、字串常用函式 二、分桶表   分桶操作是更細粒度的分配方式,一張表可以同時分割槽和分桶,分桶的原理是根據指定的列的計算hash值模餘分桶數量後將資料分開存放。   Hive的分桶實際上就是Hadoop的分割槽,有幾個桶,就用幾個reduce

Hive表的分割槽

1.Hive分割槽表 Hive使用select語句進行查詢的時候一般會掃描整個表內容,會消耗很多時間做沒必要的工作。Hive可以在建立表的時候指定分割槽空間,這樣在做查詢的時候就可以很好的提高查詢的效

hive 分割槽表、外部表

1:分割槽表      圖:建立分割槽表       圖:匯入資料         圖:在HDFS的顯示資訊 分割槽欄位就是一個資料夾的標識      圖:在多列上建立分割槽       圖:匯入資料                  圖:在多列上建立分割槽後

Hive中索引,分割槽的對比

一、索引Hive支援索引,但是Hive的索引與關係型資料庫中的索引並不相同,比如,Hive不支援主鍵或者外來鍵。Hive索引可以建立在表中的某些列上,以提升一些操作的效率,例如減少MapReduce任務中需要讀取的資料塊的數量。為什麼要建立索引?Hive的索引目的是提高Hiv

大資料Hive的案例、引數、動態分割槽、檢視、索引、執行方式、許可權管理、Hive的優化_03_03

一、案例:統計出掉線率最高的前10基站 需求:統計出掉線率最高的前10基站 資料: record_time:通話時間 imei:基站編號 cell:手機編號 drop_num:掉話的秒數duration:通話持續總秒數 1.建表 create table cell_mon

Hive中的概念的學習以及示例分析學習

我們學習一下分桶表,其實分割槽和分桶這兩個概念對於初學者來說是比較難理解的。但對於理解了的人來說,發現又是如此簡單。 我們先建立一個分桶表,並嘗試直接上傳一個數據 create table student4(sno int,sname string,sex strin