詳解hive常見表結(jié)構(gòu)
hive簡(jiǎn)介
hive是基于Hadoop的一個(gè)數(shù)據(jù)倉庫工具,用來進(jìn)行數(shù)據(jù)提取、轉(zhuǎn)化、加載,這是一種可以存儲(chǔ)、查詢和分析存儲(chǔ)在Hadoop中的大規(guī)模數(shù)據(jù)的機(jī)制。hive數(shù)據(jù)倉庫工具能將結(jié)構(gòu)化的數(shù)據(jù)文件映射為一張數(shù)據(jù)庫表,并提供SQL查詢功能,能將SQL語句轉(zhuǎn)變成MapReduce任務(wù)來執(zhí)行。Hive的優(yōu)點(diǎn)是學(xué)習(xí)成本低,可以通過類似SQL語句實(shí)現(xiàn)快速M(fèi)apReduce統(tǒng)計(jì),使MapReduce變得更加簡(jiǎn)單,而不必開發(fā)專門的MapReduce應(yīng)用程序。hive十分適合對(duì)數(shù)據(jù)倉庫進(jìn)行統(tǒng)計(jì)分析。 [1]
1.外部表
當(dāng)文件已經(jīng)存在或位于遠(yuǎn)程位置時(shí),我們可以使用外部表,外部表的存儲(chǔ)由自己指定。
特點(diǎn):刪除表,數(shù)據(jù)依然存在
建表語句
CREATE EXTERNAL TABLE tmp_xx(id int,name String);
2.內(nèi)部表
hive管理控制表的整個(gè)生命周期,存儲(chǔ)位置在hive.metastore.warehouse.dir目錄下。
特點(diǎn):刪除表時(shí),數(shù)據(jù)也被刪除
建表語句
CREATE TABLE tmp_xx(id int,name String);
3.分區(qū)表
把一個(gè)表的數(shù)據(jù)以分區(qū)字段的值作為目錄去存儲(chǔ)。
特點(diǎn):
- 縮小了硬盤掃描數(shù)據(jù)的區(qū)域,減少磁盤IO
- 將表數(shù)據(jù)存儲(chǔ)在多個(gè)分區(qū)目錄,便于獨(dú)立管理(創(chuàng)建,刪除)數(shù)據(jù)
存儲(chǔ)結(jié)構(gòu)如下

1.靜態(tài)分區(qū)
在執(zhí)行前就知道分區(qū)的值
- 可以根據(jù)PARTITIONED BY創(chuàng)建分區(qū)表,一個(gè)表可以擁有一個(gè)或者多個(gè)分區(qū),每個(gè)分區(qū)以文件夾的形式單獨(dú)存在表文件夾的目錄下。
- 分區(qū)是以字段的形式在表結(jié)構(gòu)中存在,通過describe table命令可以查看到字段存在,但是該字段不存放實(shí)際的數(shù)據(jù)內(nèi)容,僅僅是分區(qū)的表示。
- 分區(qū)建表分為2種,一種是單分區(qū),也就是說在表文件夾目錄下只有一級(jí)文件夾目錄。另外一種是多分區(qū),表文件夾下出現(xiàn)多文件夾嵌套模式。
單分區(qū)相關(guān)語法
#單分區(qū)表創(chuàng)建 CREATE TABLE tmp_xx(id int,name String) partitioned by (d string); #添加分區(qū) ALTER TABLE tmp_partition ADD IF NOT EXISTS PARTITION (d='20220628') #刪除分區(qū) ALTER TABLE tmp_partition DROP IF EXISTS PARTITION (d='20220628') #數(shù)據(jù)寫入 INSERT OVERWRITE TABLE tmp_xx PARTITION (d='20220629') SELECT id, name FROM tmp_yy limit 10; #查看分區(qū)數(shù)據(jù) select * from tmp_xx where d='20220629' #查看表分區(qū) show partitions table; #查看目錄 hadoop dfs -du -h /user/hive/warehouse/tmp_xxx
多分區(qū)相關(guān)語法
#多分區(qū)表創(chuàng)建 CREATE TABLE tmp_xx(id int,name String) partitioned by (d String,h String); #數(shù)據(jù)寫入 INSERT OVERWRITE TABLE tmp_xx PARTITION (d='20220629',h='15') SELECT id, name FROM tmp_yy limit 10; #查看分區(qū)數(shù)據(jù) select * from tmp_xx where d='20220629' and h='15'
2.動(dòng)態(tài)分區(qū)
執(zhí)行時(shí)才知道分區(qū)的值,相比于靜態(tài)分區(qū)可以一次寫入多個(gè)分區(qū)數(shù)據(jù),而不用在每次分區(qū)寫入的時(shí)候一次執(zhí)行多次insert,其他的地方和靜態(tài)分區(qū)都是一樣的。
官方文檔:https://cwiki.apache.org/confluence/display/Hive/DynamicPartitions
特點(diǎn):
- 在INSERT … SELECT …查詢中,必須在SELECT語句中的列中最后指定動(dòng)態(tài)分區(qū)列,并按PARTITION()子句中出現(xiàn)的順序進(jìn)行排列
- 如果動(dòng)態(tài)分區(qū)和靜態(tài)分區(qū)一起使用,必須是靜態(tài)分區(qū)的字段在前,動(dòng)態(tài)分區(qū)的字段在后。
想要使用動(dòng)態(tài)分區(qū)需要hive開啟動(dòng)態(tài)分區(qū),參數(shù)如下
set hive.exec.dynamic.partition=true; --開啟動(dòng)態(tài)分區(qū) 默認(rèn)為false,不開啟 set hive.exec.dynamic.partition.mode=nonstrict; --指定動(dòng)態(tài)分區(qū)模式,默認(rèn)為strict 下面參數(shù)可選 SET hive.exec.max.dynamic.partitions=2048; SET hive.exec.max.dynamic.partitions.pernode=256; SET hive.exec.max.created.files=10000; SET hive.error.on.empty.partition=true;
語法:
#寫入數(shù)據(jù) INSERT overwrite TABLE tmp_partition PARTITION(d) SELECT id,NAME,d FROM tmp_xxx #寫入多分區(qū)數(shù)據(jù) INSERT overwrite TABLE tmp_partition PARTITION(d,h) SELECT id,NAME,d,h FROM tmp_xxx #混合分區(qū)使用,使用動(dòng)態(tài)分區(qū)和靜態(tài)分區(qū),靜態(tài)分區(qū)必須在前 INSERT overwrite TABLE tmp_partition PARTITION(d='20220629',h) SELECT id,NAME,h FROM tmp_xxx
4.分桶表
對(duì)比分區(qū)表,分桶表是對(duì)數(shù)據(jù)進(jìn)行更加細(xì)粒度的劃分。一般用的比較少,在數(shù)據(jù)量比較小的時(shí)候使用分桶表可能性能更差。
分桶表將整個(gè)數(shù)據(jù)內(nèi)容按照分桶字段的哈希值進(jìn)行區(qū)分,使用該哈希值除以桶的個(gè)數(shù)得到取余數(shù),bucket_id = column.hashcode % bucket.num,余數(shù)決定了該條記錄會(huì)被分在哪個(gè)桶中。余數(shù)相同的記錄會(huì)分在一個(gè)桶里。需要注意的是,在物理結(jié)構(gòu)上,一個(gè)桶對(duì)應(yīng)一個(gè)文件,而分區(qū)表只是一個(gè)目錄,至于目錄下有多少數(shù)據(jù)是不確定的。
分桶表和分區(qū)表的區(qū)別
| 分區(qū)表 | 分桶表 | |
| 存儲(chǔ)結(jié)構(gòu) | 文件 | 目錄/文件夾 |
| 創(chuàng)建語句 | partitioned by | clustered by,指定桶個(gè)數(shù) |
| 數(shù)量 | 分區(qū)個(gè)數(shù)可增長 | 分桶數(shù)指定后不在增長 |
| 用途 | 避免掃描全表,通過分區(qū)列指定查詢目錄提高查詢速度 | 抽樣及大表join時(shí)提高效率 |
想要使用分桶表需要開啟分桶機(jī)制,默認(rèn)開啟
set hive.enforce.bucketing=true
建表
CREATE TABLE tmp_bucket(id INT,NAME STRING) clustered BY (id) INTO 4 buckets
寫入數(shù)據(jù)之后查看文件結(jié)構(gòu),發(fā)現(xiàn)表文件夾下有4個(gè)文件,說明分桶成功

1.抽樣
#建表 select columns from table tablesample(bucket x out of y on column); -- x:表示從第幾個(gè)分桶進(jìn)行抽樣 -- y:表示每隔幾個(gè)分桶取一個(gè)分桶,y必須為表bucket的整數(shù)倍或者因子 #從分桶表的建表語句中可知,我們一共分了4個(gè)桶,所以我們這里x取1,y取2 一共抽取2(4/2)個(gè)桶,從第一個(gè)桶開始,每隔2個(gè)桶抽取一次,即第一個(gè)桶和 第三個(gè)桶。 SELECT id,NAME FROM tmp_bucket tablesample(bucket 1 OUT of 2 ON id) LIMIT 10
2.map-side join
獲得更高的查詢處理效率。桶為表加上了額外的結(jié)構(gòu),Hive 在處理有些查詢時(shí)能利用這個(gè)結(jié)構(gòu)。
具體而言,連接兩個(gè)在(包含連接列的)相同列上劃分了桶的表,可以使用 Map 端連接 (Map-side join)高效的實(shí)現(xiàn)。比如JOIN操作。對(duì)于JOIN操作兩個(gè)表有一個(gè)相同的列,如果對(duì)這兩個(gè)表都進(jìn)行了桶操作。那么將保存相同列值的桶進(jìn)行JOIN操作就可以,可以大大較少JOIN的數(shù)據(jù)量。
需要注意的是這種方式只適用于大表,小表不適用,表的大小至少得幾個(gè)G或幾個(gè)T,此功能未做測(cè)試。
5.表的文件存儲(chǔ)格式
- STORED AS 指定表的文件存儲(chǔ)格式默認(rèn)TEXT FILE(文本文件)格式存儲(chǔ),
- 默認(rèn)存儲(chǔ)格式可通過hive.default.fileformat配置修改
- 其它常用存儲(chǔ)格式 Parquet(列式),Avro,ORC(列式),Sequence File,INPUT FORMAT & OUTPUT FORMAT (二進(jìn)制)
1.TEXTFILE
STORED AS INPUTFORMAT 'org.apache.hadoop.mapred.TextInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
純文本文件存儲(chǔ),TEXTFILE默認(rèn)是hive的默認(rèn)存儲(chǔ)方式,用戶可以通過配置 hive.default.fileformat 來修改。
在HDFS上可直接查看數(shù)據(jù),可結(jié)合Gzip、Bzip2使用(系統(tǒng)自動(dòng)檢查,執(zhí)行查詢時(shí)自動(dòng)解壓),但是使用這種方式,hive不會(huì)對(duì)數(shù)據(jù)進(jìn)行切分,無法對(duì)數(shù)據(jù)進(jìn)行并行操作。
存儲(chǔ)方式:行存儲(chǔ)
優(yōu)勢(shì):可使用任意的分割符進(jìn)行分割;在hdfs上可查可標(biāo)記;加載速度較快;
劣勢(shì):不會(huì)對(duì)數(shù)據(jù)進(jìn)行壓縮處理,存儲(chǔ)空間較大、磁盤開銷大、數(shù)據(jù)解析開銷大。
2.SEQUENCEFILE
STORED AS INPUTFORMAT 'org.apache.hadoop.mapred.SequenceFileInputFormat' OUTPUTFORMAT 'org.apache.hadoop.mapred.SequenceFileOutputFormat'
存儲(chǔ)為壓縮的序列化文件。是hadoop中的標(biāo)準(zhǔn)序列化文件,可壓縮,可分塊。SequenceFile是一個(gè)由二進(jìn)制序列化過的key/value的字節(jié)流組成的文本存儲(chǔ)文件,它可以在map/reduce過程中的input/output 的format時(shí)被使用。
SequenceFile 有三種壓縮態(tài):
- Uncompressed – 未進(jìn)行壓縮的狀
- record compressed - 對(duì)每一條記錄的value值進(jìn)行了壓縮(文件頭中包含上使用哪種壓縮算法的信息)
- block compressed – 當(dāng)數(shù)據(jù)量達(dá)到一定大小后,將停止寫入進(jìn)行整體壓縮,整體壓縮的方法是把所有的keylength,key,vlength,value 分別合在一起進(jìn)行整體壓縮,塊的壓縮效率要比記錄的壓縮效率高 hive中通過設(shè)置SET mapred.output.compression.type=BLOCK;來修改SequenceFile壓縮方式。
存儲(chǔ)方式:行存儲(chǔ)
優(yōu)勢(shì):存儲(chǔ)時(shí)候會(huì)對(duì)數(shù)據(jù)進(jìn)行壓縮處理,存儲(chǔ)空間??;支持文件切割分片;查詢速度比TestFile速度快;
劣勢(shì):無法可視化展示數(shù)據(jù);不可以直接使用load命令對(duì)數(shù)據(jù)進(jìn)行加載;自身的壓縮算法占用一定的空間
3.RCFILE
STORED AS INPUTFORMAT 'org.apache.hadoop.hive.ql.io.RCFileInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.RCFileOutputFormat'
文件存儲(chǔ)方式為二進(jìn)制文件。以RcFile文件格式存儲(chǔ)的表也會(huì)對(duì)數(shù)據(jù)進(jìn)行壓縮處理,在HDFS上以二進(jìn)制格式存儲(chǔ),不可直接查看。
RCFILE是一種行列存儲(chǔ)相結(jié)合的存儲(chǔ)方式,該存儲(chǔ)結(jié)構(gòu)遵循的是“先水平劃分,再垂直劃分”的設(shè)計(jì)里面。首先,將數(shù)據(jù)按行分塊形成行組,這樣可以使同一行的數(shù)據(jù)在一個(gè)節(jié)點(diǎn)上。然后,把行組內(nèi)的數(shù)據(jù)列式存儲(chǔ),將列維度的數(shù)據(jù)進(jìn)行壓縮,并提供了一種lazy解壓技術(shù)。
Rcfile在進(jìn)行數(shù)據(jù)讀取時(shí)會(huì)順序處理HDFS塊中的每個(gè)行組,讀取行組的元數(shù)據(jù)頭部和給定查詢需要的列,將其加載到內(nèi)存中并進(jìn)行解壓,直到處理下一個(gè)行組。但是,rcfile不會(huì)解壓所有的加載列,解壓采用lazy解壓技術(shù),只有滿足where條件的列才會(huì)被解壓,減少了不必要的列解壓。
在rcfile中每一個(gè)行組的大小是可變的,默認(rèn)行組大小為4MB。行組變大可以提升數(shù)據(jù)的壓縮效率,減少并發(fā)存儲(chǔ)量,但是在讀取數(shù)據(jù)時(shí)會(huì)占用更多的內(nèi)存,可能影響查詢效率和其他的并發(fā)查詢。用戶可根據(jù)具體機(jī)器和自身需要調(diào)整行組大小。
存儲(chǔ)方式:行列混合的存儲(chǔ)格式,將相近的行分塊后,每塊按列存儲(chǔ)。
優(yōu)勢(shì):基于列存儲(chǔ),壓縮快且效率更高,;占用的磁盤存儲(chǔ)空間小,讀取記錄時(shí)涉及的block少,IO?。徊樵兞袝r(shí),讀取所需列只需讀取列所在塊的頭部定義,讀取速度快(在讀取全量數(shù)據(jù)時(shí),性能與Sequence沒有明顯區(qū)別);
劣勢(shì):無法可視化展示數(shù)據(jù);導(dǎo)入數(shù)據(jù)時(shí)耗時(shí)較長;不能直接使用load命令對(duì)數(shù)據(jù)進(jìn)行加載;自身的壓縮算法占用一定空間,但比SequenceFile所占空間稍??;
4.ORC
ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.orc.OrcSerde' STORED AS INPUTFORMAT 'org.apache.hadoop.hive.ql.io.orc.OrcInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.orc.OrcOutputFormat'
ORC (Optimized Record Columnar)是RC File 的改進(jìn),主要在壓縮編碼、查詢性能上進(jìn)行了升級(jí); ORC具備一些高級(jí)特性,如:update操作,支持ACID,支持struct、array復(fù)雜類型。Hive1.x版本后支持事務(wù)和update操作,就是基于ORC實(shí)現(xiàn)的(目前其他存儲(chǔ)格式暫不支持)。
存儲(chǔ)方式:按行組分割整個(gè)表,行組內(nèi)進(jìn)行列式存儲(chǔ)。數(shù)據(jù)按行分塊,每塊按照列存儲(chǔ)
文件結(jié)構(gòu):
首先做一些名詞注釋:
ORC文件:保存在文件系統(tǒng)上的普通二進(jìn)制文件,一個(gè)ORC文件中包含多個(gè)stripe,每個(gè)stripe包含多條記錄,這些記錄按照列進(jìn)行獨(dú)立存儲(chǔ)。
文件級(jí)元數(shù)據(jù):包括文件的描述信息postscript、文件meta信息(包括整個(gè)文件的統(tǒng)計(jì)信息)、所有的stripe的信息和schema信息。
Stripe:一組行形成一個(gè)stripe,每次讀取文件是以行組為單位的,一般為hdfs的塊大小,保存了每一列的索引和數(shù)據(jù)。
Stripe元數(shù)據(jù):保存stripe的位置、每個(gè)列在該stripe的統(tǒng)計(jì)信息以及所有的stream類型和位置。
Row group:索引的最小單位,一個(gè)stripe中包含多個(gè)row group,默認(rèn)為10000個(gè)值組成。
Stream:一個(gè)stream表示文件中的一段有效的數(shù)據(jù),包括索引和數(shù)據(jù)。索引stream保存每一個(gè)row group的位置和統(tǒng)計(jì)信息,數(shù)據(jù)stream包括多種類型的數(shù)據(jù),具體情況由該列類型和編碼方式?jīng)Q定。
在ORC文件中保存了三個(gè)層級(jí)的統(tǒng)計(jì)信息,分別為文件級(jí)別、stripe級(jí)別和row group級(jí)別,他們可以根據(jù)下發(fā)的搜索參數(shù)判斷是否可以跳過某些數(shù)據(jù)。在這些統(tǒng)計(jì)信息中包含成員數(shù)和是否有null值,且對(duì)不同類型的數(shù)據(jù)設(shè)置了特定統(tǒng)計(jì)信息。
ORC的文件結(jié)構(gòu)如下:

文件級(jí)別:
在ORC文件的末尾記錄了文件級(jí)別的統(tǒng)計(jì)信息,包括整個(gè)文件的列統(tǒng)計(jì)信息。這些信息主要是用于查詢的優(yōu)化,也可以為一些簡(jiǎn)單的聚合查詢?nèi)鏼ax、min、sum輸出結(jié)果。
Stripe級(jí)別:
保留行級(jí)別的統(tǒng)計(jì)信息,用于判斷該Stripe中的記錄是否符合where中的條件,是否需要被讀取。
Row group級(jí)別:
進(jìn)一步避免讀取不必要的數(shù)據(jù),在邏輯上將一個(gè)column的index分割成多個(gè)index組(默認(rèn)為10000,可配置)。以這些index記錄為一個(gè)組,對(duì)數(shù)據(jù)進(jìn)行統(tǒng)計(jì)。在查詢時(shí)可根據(jù)組級(jí)別的統(tǒng)計(jì)信息過濾掉不必要的數(shù)據(jù)。
優(yōu)勢(shì):具有很高的壓縮比,且可切分;由于壓縮比高,在查詢時(shí)輸入的數(shù)據(jù)量小,使用的task減少,所以提升了數(shù)據(jù)查詢速度和處理性能;每個(gè)task只輸出單個(gè)文件,減少了namenode的負(fù)載壓力;在ORC文件中會(huì)對(duì)每一個(gè)字段建立一個(gè)輕量級(jí)的索引,如:row group index、bloom filter index等,可以用于where條件過濾;可使用load命令加載,但加載后select * from xx;無法讀取數(shù)據(jù);查詢速度比rcfile快;支持復(fù)雜的數(shù)據(jù)類型;
劣勢(shì):無法可視化展示數(shù)據(jù);讀寫時(shí)需要消耗額外的CPU資源用于壓縮和解壓縮,但消耗較少;對(duì)schema演化支持較差;
5.Parquet
ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe' STORED AS INPUTFORMAT 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat'
Parquet 最初的設(shè)計(jì)動(dòng)機(jī)是存儲(chǔ)嵌套式數(shù)據(jù),,比如Protocolbuffer,thrift,json等,將這類數(shù)據(jù)存儲(chǔ)成列式格式,以方便對(duì)其高效壓縮和編碼,且使用更少的IO操作取出需要的數(shù)據(jù)??偟膩碚fParquet與orc相比的主要優(yōu)勢(shì)是對(duì)嵌套結(jié)構(gòu)的支持,orc的多層級(jí)嵌套表達(dá)復(fù)雜底層未采用google dremel類似實(shí)現(xiàn),性能和空間損失較大。
存儲(chǔ)方式:列式存儲(chǔ)
優(yōu)勢(shì):具有高效壓縮和編碼,是使用時(shí)有更少的IO取出所需數(shù)據(jù),速度比ORC快;其他方面類似于ORC;
劣勢(shì):不支持update;不支持ACID;不支持可視化展示數(shù)據(jù)
| ORC | Parquet | |
| 存儲(chǔ)方式 | 列存儲(chǔ) | 列存儲(chǔ) |
| 嵌套式結(jié)構(gòu) | orc的多層級(jí)嵌套表達(dá)復(fù)雜且底層未采用google dremel類似實(shí)現(xiàn),性能和空間損失較大 | 支持比較完美 |
| ACID | 支持 | 不支持 |
| update操作 | 支持 | 不支持 |
| 索引 | 粗粒度索引,block/group/chuck級(jí)別統(tǒng)計(jì)信息 | 粗粒度索引,file/stripe/row級(jí)別統(tǒng)計(jì)信息,不能精確到列建索引。 |
| 查詢性能 | 比parquet稍高 | 比ORC稍低 |
| 壓縮 | 高 | 低 |
6.總結(jié)
需要查看到所存儲(chǔ)的具體數(shù)據(jù)內(nèi)容的小型查詢,可以采用默認(rèn)文件格式textfile。不需要查看具體數(shù)據(jù)的小型查詢時(shí)可使用sequencefile文件格式。當(dāng)用于大數(shù)據(jù)量的查詢時(shí),可以使用rcfile、ORC、parquet,一般情況下推薦使用ORC,若字段數(shù)較多,不涉及到更新且取部分列查詢場(chǎng)景多的情況下建議使用parquet。
需要通過sqoop+hive與關(guān)系型數(shù)據(jù)庫交互時(shí),import和export的hive表需要是textfile格式。如果需要操作的表不是此存儲(chǔ)格式,需要insert到textfile格式的表中再操作。
一、ORC與Parquet總結(jié)對(duì)比 1、orc不支持嵌套結(jié)構(gòu)(但可通過復(fù)雜數(shù)據(jù)類型如map<k,v>間接實(shí)現(xiàn)),parquet支持嵌套結(jié)構(gòu) 2、orc與hive的兼容性強(qiáng),作為hive的常用存儲(chǔ)格式 3、orc相比parquet的存儲(chǔ)壓縮率較高,如下圖 4、orc導(dǎo)入數(shù)據(jù)和數(shù)據(jù)查詢的的速度比parquet快

5.表的行存儲(chǔ)格式(row format)
ROW FORMAT:控制文件數(shù)據(jù)和hive表中Row數(shù)據(jù)的轉(zhuǎn)換,有DELIMITED和SERDE兩種值,可以將ROW FORMAT看做FileFormat的功能支持或?qū)崿F(xiàn),我們?cè)O(shè)置了FileFormat后,底層數(shù)據(jù)格式的轉(zhuǎn)換是依賴SerDe來做的。
DELIMITED:表示使用默認(rèn)的LazySimpleSerDe類來處理數(shù)據(jù),一般用于用分隔符分隔的文本文,默認(rèn)使用native Serde
SERDE:Serde是 Serializer/Deserializer的簡(jiǎn)寫。hive使用Serde進(jìn)行行對(duì)象的序列與反序列化。Hive使用SerDe讀取和寫入行對(duì)象。讀取就是hdfs文件反序列化成對(duì)象,寫入就是對(duì)象序列化存儲(chǔ)hdfs
read:HDFS files --> InputFileFormat --> <key, value> --> Deserializer --> Row object write: row object --> Serializer --> <key, value> --> OutputFileFormat --> HDFS files
一般用于比較復(fù)雜格式的文本文件,比如JSON格式行、正則表達(dá)式可以匹配出的行,像訪問日志。
6.表屬性
1.壓縮
1.為什么要壓縮
可以提高吞吐量和性能,大量減少磁盤存儲(chǔ)空間。同時(shí)壓縮也會(huì)減少文件在磁盤間的傳輸及IO消耗,但是壓縮和截壓縮會(huì)帶來額外的CPU開銷,但是可以節(jié)省更多的IO消耗和內(nèi)存使用。
2.壓縮常見的格式
| 壓縮方式 | 壓縮后大小 | 壓縮速度 | 是否可切分 |
| GZIP | 中 | 中 | 否 |
| BZIP2 | 小 | 慢 | 是 |
| LZO | 大 | 快 | 是 |
| Snappy | 大 | 快 | 否 |
3.壓縮性能比較
壓縮算法 原始文件大小 壓縮文件大小 壓縮速度 解壓速度
gzip 8.3GB 1.8GB 17.5MB/S 58MB/S
bzip2 8.3GB 1.1GB 2.4MB/S 9.5MB/S
lzo 8.3GB 2.9GB 49.3MB/S 74.6MB/S
tblproperties ('orc.compress'='snappy')
tblproperties ('parquet.compression'='snappy');3)開啟MAP輸出階段壓縮 (1)開啟hive中間傳輸數(shù)據(jù)壓縮功能
hive (default)>set hive.exec.compress.intermediate=true;
(2)開啟mapreduce中map輸出壓縮功能
hive (default)>set mapreduce.map.output.compress=true;
(3)設(shè)置mapreduce中map輸出數(shù)據(jù)的壓縮方式
hive (default)>set mapreduce.map.output.compress.codec=
org.apache.hadoop.io.compress.SnappyCodec;
4)開啟REDUCE輸出階段壓縮,比map端壓縮事兒多 (1)開啟hive最終輸出數(shù)據(jù)壓縮功能
hive (default)>set hive.exec.compress.output=true;
(2)開啟mapreduce最終輸出數(shù)據(jù)壓縮
hive (default)>set mapreduce.output.fileoutputformat.compress=true;
(3)設(shè)置mapreduce最終數(shù)據(jù)輸出壓縮方式
hive (default)> set mapreduce.output.fileoutputformat.compress.codec =
org.apache.hadoop.io.compress.SnappyCodec;
(4)設(shè)置mapreduce最終數(shù)據(jù)輸出壓縮為塊壓縮
hive (default)> set mapreduce.output.fileoutputformat.compress.type=BLOCK;
在生產(chǎn)環(huán)境中,常用的HIVE存儲(chǔ)格式:列式存儲(chǔ)的orc和parquet
HIVE壓縮格式:冷數(shù)據(jù)-----gzip壓縮(壓縮比高,壓縮解壓縮速度高,不可切割);
非冷數(shù)據(jù)------lzo(可切割)和snappy(不可切割)
LZO支持切片,Snappy不支持切片。 ORC和Parquet都是列式存儲(chǔ)。 ORC和Parquet 兩種存儲(chǔ)格式都是不能直接讀取的,一般與壓縮一起使用,可大大節(jié)省磁盤空間。 選擇:ORC文件支持Snappy壓縮,但不支持lzo壓縮,所以在實(shí)際生產(chǎn)中,使用Parquet存儲(chǔ) + lzo壓縮的方式更為常見,這種情況下可以避免由于讀取不可分割大文件引發(fā)的數(shù)據(jù)傾斜。 但是,如果數(shù)據(jù)量并不大(預(yù)測(cè)不會(huì)有超大文件,若干G以上)的情況下,使用ORC存儲(chǔ),snappy壓縮的效率還是非常高的。
ORC支持三種壓縮:ZLIB,SNAPPY,NONE。最后一種就是不壓縮,orc默認(rèn)采用的是ZLIB壓縮。
Parquet支持的壓縮:UNCOMPRESSED、 SNAPPY、GZP和LZO,默認(rèn)UNCOMPRESSED不壓縮
到此這篇關(guān)于hive常見表結(jié)構(gòu)的文章就介紹到這了,更多相關(guān)hive表結(jié)構(gòu)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
數(shù)據(jù)庫報(bào):ORA-01196(ORA-10458/ORA-01110)錯(cuò)誤的解決方法
這篇文章主要給大家介紹了關(guān)于數(shù)據(jù)庫報(bào):ORA-01196(ORA-10458/ORA-01110)錯(cuò)誤的解決方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用數(shù)據(jù)庫具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05
JetBrains出品一款好用到爆的DataGrip數(shù)據(jù)庫工具使用入門
這篇文章主要介紹了JetBrains出品一款好用到爆的DataGrip數(shù)據(jù)庫工具使用入門,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-01-01
SQL 隨機(jī)查詢 包括(sqlserver,mysql,access等)
SQL 隨機(jī)查詢 包括(sqlserver,mysql,access等),需要的朋友可以參考下,目的一般是為了隨機(jī)讀取數(shù)據(jù)庫中的記錄。2009-10-10
當(dāng)數(shù)據(jù)庫變慢時(shí)的解決方法
當(dāng)數(shù)據(jù)庫變慢時(shí),我們應(yīng)如何入手,下面的解決方法。2009-04-04
關(guān)于數(shù)據(jù)庫系統(tǒng)的概述
大家好,本篇文章主要講的是關(guān)于數(shù)據(jù)庫系統(tǒng)的概述,感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽2021-12-12
dapper使用Insert或update時(shí)部分字段不映射到數(shù)據(jù)庫
我們?cè)谑褂胐apper的insert或update方法時(shí)可能會(huì)遇見一些實(shí)體中存在的字段但是,數(shù)據(jù)庫中不存在的字段,這樣在使用insert時(shí)就是拋出異常提示字段不存在,這個(gè)時(shí)候該怎么解決呢,下面給大家分享示例實(shí)體代碼,感興趣的朋友一起看看吧2023-12-12
MySQL與Oracle數(shù)據(jù)類型對(duì)應(yīng)關(guān)系(表格形式)
MySQL與Oracle兩種數(shù)據(jù)庫在工作中,都是用的比較多的數(shù)據(jù)庫,由于MySQL與Oracle在數(shù)據(jù)類型上有部分差異,在我們遷移數(shù)據(jù)庫時(shí),會(huì)遇上一定的麻煩,下面介紹MySQL與Oracle數(shù)據(jù)庫數(shù)據(jù)類型的對(duì)應(yīng)關(guān)系2017-04-04
淺談一下數(shù)據(jù)庫系統(tǒng)的發(fā)展與組成
這篇文章主要介紹了淺談一下數(shù)據(jù)庫系統(tǒng)的發(fā)展與組成,數(shù)據(jù)庫系統(tǒng),指在計(jì)算機(jī)系統(tǒng)中引入數(shù)據(jù)庫后的系統(tǒng),一般由數(shù)據(jù)庫、數(shù)據(jù)庫管理系統(tǒng)、應(yīng)用系統(tǒng)、數(shù)據(jù)庫管理員(DBA)構(gòu)成,本文就數(shù)據(jù)庫的發(fā)展展開詳細(xì)講解2023-07-07
數(shù)據(jù)庫服務(wù)器構(gòu)建和部署檢查列表詳解
這篇文章主要介紹了數(shù)據(jù)庫服務(wù)器構(gòu)建和部署檢查列表的相關(guān)內(nèi)容,小編覺得挺不錯(cuò)的,這里分享給大家,供各位參考。2017-10-10

