欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解hive常見表結(jié)構(gòu)

 更新時(shí)間:2022年08月11日 09:20:24   作者:q495673918  
hive是基于Hadoop的一個(gè)數(shù)據(jù)倉(cāng)庫(kù)工具,用來(lái)進(jìn)行數(shù)據(jù)提取、轉(zhuǎn)化、加載,這是一種可以存儲(chǔ)、查詢和分析存儲(chǔ)在Hadoop中的大規(guī)模數(shù)據(jù)的機(jī)制,這篇文章主要介紹了hive常見表結(jié)構(gòu),需要的朋友可以參考下

hive簡(jiǎn)介

hive是基于Hadoop的一個(gè)數(shù)據(jù)倉(cāng)庫(kù)工具,用來(lái)進(jìn)行數(shù)據(jù)提取、轉(zhuǎn)化、加載,這是一種可以存儲(chǔ)、查詢和分析存儲(chǔ)在Hadoop中的大規(guī)模數(shù)據(jù)的機(jī)制。hive數(shù)據(jù)倉(cāng)庫(kù)工具能將結(jié)構(gòu)化的數(shù)據(jù)文件映射為一張數(shù)據(jù)庫(kù)表,并提供SQL查詢功能,能將SQL語(yǔ)句轉(zhuǎn)變成MapReduce任務(wù)來(lái)執(zhí)行。Hive的優(yōu)點(diǎn)是學(xué)習(xí)成本低,可以通過類似SQL語(yǔ)句實(shí)現(xiàn)快速M(fèi)apReduce統(tǒng)計(jì),使MapReduce變得更加簡(jiǎn)單,而不必開發(fā)專門的MapReduce應(yīng)用程序。hive十分適合對(duì)數(shù)據(jù)倉(cāng)庫(kù)進(jìn)行統(tǒng)計(jì)分析。 [1]

1.外部表

當(dāng)文件已經(jīng)存在或位于遠(yuǎn)程位置時(shí),我們可以使用外部表,外部表的存儲(chǔ)由自己指定。

特點(diǎn):刪除表,數(shù)據(jù)依然存在

建表語(yǔ)句

CREATE EXTERNAL TABLE tmp_xx(id int,name String);

2.內(nèi)部表

hive管理控制表的整個(gè)生命周期,存儲(chǔ)位置在hive.metastore.warehouse.dir目錄下。

特點(diǎn):刪除表時(shí),數(shù)據(jù)也被刪除

建表語(yǔ)句

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ū),也就是說(shuō)在表文件夾目錄下只有一級(jí)文件夾目錄。另外一種是多分區(qū),表文件夾下出現(xiàn)多文件夾嵌套模式。

單分區(qū)相關(guān)語(yǔ)法

#單分區(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)語(yǔ)法

#多分區(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語(yǔ)句中的列中最后指定動(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;

語(yǔ)法:

#寫入數(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)建語(yǔ)句partitioned byclustered by,指定桶個(gè)數(shù)
數(shù)量分區(qū)個(gè)數(shù)可增長(zhǎng)分桶數(shù)指定后不在增長(zhǎng)
用途避免掃描全表,通過分區(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è)文件,說(shuō)明分桶成功

 

1.抽樣

#建表
select columns from table tablesample(bucket x out of y on column);
-- x:表示從第幾個(gè)分桶進(jìn)行抽樣
-- y:表示每隔幾個(gè)分桶取一個(gè)分桶,y必須為表bucket的整數(shù)倍或者因子
 
#從分桶表的建表語(yǔ)句中可知,我們一共分了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 來(lái)修改。

在HDFS上可直接查看數(shù)據(jù),可結(jié)合Gzip、Bzip2使用(系統(tǒng)自動(dòng)檢查,執(zhí)行查詢時(shí)自動(dòng)解壓),但是使用這種方式,hive不會(huì)對(duì)數(shù)據(jù)進(jìn)行切分,無(wú)法對(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;來(lái)修改SequenceFile壓縮方式。

存儲(chǔ)方式:行存儲(chǔ)

優(yōu)勢(shì):存儲(chǔ)時(shí)候會(huì)對(duì)數(shù)據(jù)進(jìn)行壓縮處理,存儲(chǔ)空間??;支持文件切割分片;查詢速度比TestFile速度快;

劣勢(shì):無(wú)法可視化展示數(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ì):無(wú)法可視化展示數(shù)據(jù);導(dǎo)入數(shù)據(jù)時(shí)耗時(shí)較長(zhǎng);不能直接使用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;無(wú)法讀取數(shù)據(jù);查詢速度比rcfile快;支持復(fù)雜的數(shù)據(jù)類型;

劣勢(shì):無(wú)法可視化展示數(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ù)。總的來(lái)說(shuō)Parquet與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ù)

 
 ORCParquet
存儲(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ù)庫(kù)交互時(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來(lái)做的。

DELIMITED:表示使用默認(rèn)的LazySimpleSerDe類來(lái)處理數(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ì)帶來(lái)額外的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)文章

  • Maven nexus 安裝nexus私服出現(xiàn)的問題和解決辦法

    Maven nexus 安裝nexus私服出現(xiàn)的問題和解決辦法

    本文主要介紹安裝nexus私服的時(shí)候出現(xiàn)問題的解決辦法,這里整理了兩種問題并詳細(xì)說(shuō)明了解決辦法,有需要的朋友可以參考下
    2016-08-08
  • navicat導(dǎo)入CSV文件詳細(xì)操作步驟

    navicat導(dǎo)入CSV文件詳細(xì)操作步驟

    通過Navicat我們可以很方便的完成備份和還原操作,下面這篇文章主要給大家介紹了關(guān)于navicat導(dǎo)入CSV文件的詳細(xì)操作步驟,需要的朋友可以參考下
    2023-12-12
  • Navicat12.1系列破解激活教程親測(cè)有效

    Navicat12.1系列破解激活教程親測(cè)有效

    這篇文章主要介紹了 Navicat12.1系列破解激活教程親測(cè)有效,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-11-11
  • SQL知識(shí)點(diǎn)之列轉(zhuǎn)行Unpivot函數(shù)

    SQL知識(shí)點(diǎn)之列轉(zhuǎn)行Unpivot函數(shù)

    這篇文章主要給大家介紹了關(guān)于SQL知識(shí)點(diǎn)之列轉(zhuǎn)行Unpivot函數(shù)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用SQL具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • SQL中游標(biāo)(cursor)的基本使用實(shí)例

    SQL中游標(biāo)(cursor)的基本使用實(shí)例

    當(dāng)你檢索的數(shù)據(jù)只是一條記錄時(shí),你所編寫的事務(wù)語(yǔ)句代碼往往使用SELECT INSERT語(yǔ)句,但如果從某一結(jié)果集中逐一地讀取一條記錄呢?游標(biāo)為我們提供了一種極為優(yōu)秀的解決方案,這篇文章主要給大家介紹了關(guān)于SQL中游標(biāo)(cursor)基本使用的相關(guān)資料,需要的朋友可以參考下
    2021-11-11
  • 你應(yīng)該知道的區(qū)塊鏈運(yùn)作7個(gè)核心技術(shù)

    你應(yīng)該知道的區(qū)塊鏈運(yùn)作7個(gè)核心技術(shù)

    這篇文章主要為大家詳細(xì)介紹了你應(yīng)該知道的區(qū)塊鏈運(yùn)作7個(gè)核心技術(shù),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • 將sqlite3中數(shù)據(jù)導(dǎo)入到mysql中的實(shí)戰(zhàn)教程

    將sqlite3中數(shù)據(jù)導(dǎo)入到mysql中的實(shí)戰(zhàn)教程

    最近因?yàn)楣ぷ鞯男枨?,需要將sqlite3中的數(shù)據(jù)導(dǎo)入到mysql中去,發(fā)現(xiàn)網(wǎng)上的一些教程都不夠詳細(xì),索性自己寫一篇,下面這篇文章主要給大家介紹了關(guān)于將sqlite3數(shù)據(jù)庫(kù)中的數(shù)據(jù)導(dǎo)入到mysql數(shù)據(jù)庫(kù)中的相關(guān)資料,需要的朋友可以參考下。
    2017-07-07
  • SQL 按特定字段值排序

    SQL 按特定字段值排序

    SQL 按特定字段值排序的代碼,有需要的朋友可以參考下。
    2009-08-08
  • 一款高顏值且免費(fèi)的 SQL 開發(fā)工具之Beekeeper Studio詳解

    一款高顏值且免費(fèi)的 SQL 開發(fā)工具之Beekeeper Studio詳解

    今天給大家推薦一款適用于Windows,Linux和Mac的跨平臺(tái)免費(fèi)的開源SQL編輯器和數(shù)據(jù)庫(kù)管理應(yīng)用程序 —— beekeeper-studio。對(duì)Beekeeper Studio 安裝使用教程感興趣的朋友一起看看吧
    2021-09-09
  • 數(shù)據(jù)庫(kù)系統(tǒng)結(jié)構(gòu)詳解之三級(jí)模式結(jié)構(gòu)

    數(shù)據(jù)庫(kù)系統(tǒng)結(jié)構(gòu)詳解之三級(jí)模式結(jié)構(gòu)

    這篇文章主要為大家介紹了數(shù)據(jù)庫(kù)系統(tǒng)的結(jié)構(gòu),文中通過圖文的方式詳細(xì)的解析了數(shù)據(jù)庫(kù)系統(tǒng)結(jié)構(gòu)的三級(jí)模式結(jié)構(gòu),有需要的朋友可以借鑒參考下
    2021-09-09

最新評(píng)論