hive 行转列和列转行的方法_Hive超详细存储
文件存儲(chǔ)格式
Hive支持的存儲(chǔ)數(shù)據(jù)的格式主要有:TEXTFILE 、SEQUENCEFILE、ORC、PARQUET。
列式存儲(chǔ)和行式存儲(chǔ)
左邊為邏輯表,右邊第一個(gè)為行式存儲(chǔ),第二個(gè)為列式存儲(chǔ)
行存儲(chǔ)的特點(diǎn)
查詢滿足條件的一整行數(shù)據(jù)的時(shí)候,列存儲(chǔ)則需要去每個(gè)聚集的字段找到對(duì)應(yīng)的每個(gè)列的值,行存儲(chǔ)只需要找到其中一個(gè)值,其余的值都在相鄰地方,所以此時(shí)行存儲(chǔ)查詢的速度更快。
列存儲(chǔ)的特點(diǎn)
因?yàn)槊總€(gè)字段的數(shù)據(jù)聚集存儲(chǔ),在查詢只需要少數(shù)幾個(gè)字段的時(shí)候,能大大減少讀取的數(shù)據(jù)量;每個(gè)字段的數(shù)據(jù)類型一定是相同的,列式存儲(chǔ)可以針對(duì)性的設(shè)計(jì)更好的設(shè)計(jì)壓縮算法。
TEXTFILE和SEQUENCEFILE的存儲(chǔ)格式都是基于行存儲(chǔ)的;
ORC和PARQUET是基于列式存儲(chǔ)的。
TextFile格式
默認(rèn)格式,數(shù)據(jù)不做壓縮,磁盤開(kāi)銷大,數(shù)據(jù)解析開(kāi)銷大。可結(jié)合Gzip、Bzip2使用,但使用Gzip這種方式,hive不會(huì)對(duì)數(shù)據(jù)進(jìn)行切分,從而無(wú)法對(duì)數(shù)據(jù)進(jìn)行并行操作
#Orc格式
Orc (Optimized Row Columnar)是Hive 0.11版里引入的新的存儲(chǔ)格式
可以看到每個(gè)Orc文件由1個(gè)或多個(gè)stripe組成,每個(gè)stripe一般為HDFS的塊大小,每一個(gè)stripe包含多條記錄,這些記錄按照列進(jìn)行獨(dú)立存儲(chǔ),對(duì)應(yīng)到Parquet中的row group的概念。每個(gè)Stripe里有三部分組成,分別是Index Data,Row Data,Stripe Footer:
Index Data:一個(gè)輕量級(jí)的index,默認(rèn)是每隔1W行做一個(gè)索引。這里做的索引應(yīng)該只是記錄某行的各字段在Row Data中的offset。
Row Data:存的是具體的數(shù)據(jù),先取部分行,然后對(duì)這些行按列進(jìn)行存儲(chǔ)。對(duì)每個(gè)列進(jìn)行了編碼,分成多個(gè)Stream來(lái)存儲(chǔ)。
Stripe Footer:存的是各個(gè)Stream的類型,長(zhǎng)度等信息。
每個(gè)文件有一個(gè)File Footer,這里面存的是每個(gè)Stripe的行數(shù),每個(gè)Column的數(shù)據(jù)類型信息等;每個(gè)文件的尾部是一個(gè)PostScript,這里面記錄了整個(gè)文件的壓縮類型以及FileFooter的長(zhǎng)度信息等。在讀取文件時(shí),會(huì)seek到文件尾部讀PostScript,從里面解析到File Footer長(zhǎng)度,再讀FileFooter,從里面解析到各個(gè)Stripe信息,再讀各個(gè)Stripe,即從后往前讀。
Parquet格式
Parquet文件是以二進(jìn)制方式存儲(chǔ)的,所以是不可以直接讀取的,文件中包括該文件的數(shù)據(jù)和元數(shù)據(jù),因此Parquet格式文件是自解析的。
行組(Row Group):每一個(gè)行組包含一定的行數(shù),在一個(gè)HDFS文件中至少存儲(chǔ)一個(gè)行組,類似于orc的stripe的概念。
列塊(Column Chunk):在一個(gè)行組中每一列保存在一個(gè)列塊中,行組中的所有列連續(xù)的存儲(chǔ)在這個(gè)行組文件中。一個(gè)列塊中的值都是相同類型的,不同的列塊可能使用不同的算法進(jìn)行壓縮。
頁(yè)(Page):每一個(gè)列塊劃分為多個(gè)頁(yè),一個(gè)頁(yè)是最小的編碼的單位,在同一個(gè)列塊的不同頁(yè)可能使用不同的編碼方式。
通常情況下,在存儲(chǔ)Parquet數(shù)據(jù)的時(shí)候會(huì)按照Block大小設(shè)置行組的大小,由于一般情況下每一個(gè)Mapper任務(wù)處理數(shù)據(jù)的最小單位是一個(gè)Block,這樣可以把每一個(gè)行組由一個(gè)Mapper任務(wù)處理,增大任務(wù)執(zhí)行并行度。Parquet文件的格式如圖
上圖展示了一個(gè)Parquet文件的內(nèi)容,一個(gè)文件中可以存儲(chǔ)多個(gè)行組,文件的首位都是該文件的Magic Code,用于校驗(yàn)它是否是一個(gè)Parquet文件,Footer length記錄了文件元數(shù)據(jù)的大小,通過(guò)該值和文件長(zhǎng)度可以計(jì)算出元數(shù)據(jù)的偏移量,文件的元數(shù)據(jù)中包括每一個(gè)行組的元數(shù)據(jù)信息和該文件存儲(chǔ)數(shù)據(jù)的Schema信息。除了文件中每一個(gè)行組的元數(shù)據(jù),每一頁(yè)的開(kāi)始都會(huì)存儲(chǔ)該頁(yè)的元數(shù)據(jù),在Parquet中,有三種類型的頁(yè):數(shù)據(jù)頁(yè)、字典頁(yè)和索引頁(yè)。數(shù)據(jù)頁(yè)用于存儲(chǔ)當(dāng)前行組中該列的值,字典頁(yè)存儲(chǔ)該列值的編碼字典,每一個(gè)列塊中最多包含一個(gè)字典頁(yè),索引頁(yè)用來(lái)存儲(chǔ)當(dāng)前行組下該列的索引,目前Parquet中還不支持索引頁(yè)
主流文件存儲(chǔ)格式對(duì)比實(shí)驗(yàn)
從存儲(chǔ)文件的壓縮比和查詢速度兩個(gè)角度對(duì)比。
存儲(chǔ)文件的壓縮比測(cè)試
TextFile
創(chuàng)建表,存儲(chǔ)數(shù)據(jù)格式為TEXTFILE
track_time string,
url string,
session_id string,
referer string,
ip string,
end_user_id string,
city_id string
)
row format delimited fields terminated by '\t'
stored as textfile ;
向表中加載數(shù)據(jù)
查看表中數(shù)據(jù)大小
18.1 M /user/hive/warehouse/log_text/log.data
ORC
創(chuàng)建表,存儲(chǔ)數(shù)據(jù)格式為ORC
track_time string,
url string,
session_id string,
referer string,
ip string,
end_user_id string,
city_id string
)
row format delimited fields terminated by '\t'
stored as orc ;
向表中加載數(shù)據(jù)
查看表中數(shù)據(jù)大小
2.8 M /user/hive/warehouse/log_orc/000000_0
Parquet
創(chuàng)建表,存儲(chǔ)數(shù)據(jù)格式為parquet
track_time string,
url string,
session_id string,
referer string,
ip string,
end_user_id string,
city_id string
)
row format delimited fields terminated by '\t'
stored as parquet ;
向表中加載數(shù)據(jù)
查看表中數(shù)據(jù)大小
13.1 M /user/hive/warehouse/log_parquet/000000_0
存儲(chǔ)文件的壓縮比總結(jié):
ORC > Parquet > textFile
存儲(chǔ)文件的查詢速度測(cè)試
TextFile
hive (default)> select count(*) from log_text;_c0
100000
Time taken: 21.54 seconds, Fetched: 1 row(s)
Time taken: 21.08 seconds, Fetched: 1 row(s)
Time taken: 19.298 seconds, Fetched: 1 row(s)
ORC
hive (default)> select count(*) from log_orc;_c0
100000
Time taken: 20.867 seconds, Fetched: 1 row(s)
Time taken: 22.667 seconds, Fetched: 1 row(s)
Time taken: 18.36 seconds, Fetched: 1 row(s)
Parquet
hive (default)> select count(*) from log_parquet;_c0
100000
Time taken: 22.922 seconds, Fetched: 1 row(s)
Time taken: 21.074 seconds, Fetched: 1 row(s)
Time taken: 18.384 seconds, Fetched: 1 row(s)
存儲(chǔ)文件的查詢速度總結(jié):查詢速度相近。
簡(jiǎn)書(shū):https://www.jianshu.com/u/0278602aea1d
CSDN:https://blog.csdn.net/u012387141
總結(jié)
以上是生活随笔為你收集整理的hive 行转列和列转行的方法_Hive超详细存储的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: div 隐藏_CSS实现六边形Div图片
- 下一篇: python 外部程序 交互_使用Pyt