Hive分割槽和分桶
Hive把表組織成分割槽(partition)。這是一種根據分割槽列(partition column,如日期)的值對錶進行粗略的劃分機制。使用分割槽可以加快資料分片(slice)的查詢速度。
表或分割槽可以進一步劃分為桶(bucket)。它會為資料提供額外的結構以獲取更高效的查詢處理。例如,通過根據使用者ID來劃分桶,我們可以在所有使用者集合的隨機樣本上快速計算基於使用者的查詢。
分桶適用場景:
資料抽樣( sampling )、map-join
- 建立分割槽表
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)
可以看到分割槽資訊中多了兩個分割槽欄位
載入資料:
- 準備資料
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中檢視,也能看到資料存在兩個分割槽列目錄中:
- 建立分桶表
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