溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

大數(shù)據(jù)存儲(chǔ)格式parquet是怎樣的

發(fā)布時(shí)間:2022-01-14 15:38:06 來源:億速云 閱讀:160 作者:柒染 欄目:云計(jì)算

這篇文章將為大家詳細(xì)講解有關(guān)大數(shù)據(jù)存儲(chǔ)格式parquet是怎樣的,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對(duì)相關(guān)知識(shí)有一定的了解。

大數(shù)據(jù)存儲(chǔ)格式-parquet

為什么需要列式存儲(chǔ)

首先我們從關(guān)系數(shù)據(jù)庫入手,來看關(guān)系數(shù)據(jù)庫的一些常見查詢。對(duì)于關(guān)系數(shù)據(jù)庫而言,我們常見的查詢一般有詳情查詢或者統(tǒng)計(jì)分組,但是如果是大數(shù)據(jù)量的情況下,關(guān)系數(shù)據(jù)庫是不能很好的支持統(tǒng)計(jì)類的查詢,所以一般關(guān)系數(shù)據(jù)庫多有于對(duì)OLTP業(yè)務(wù),那么常見的大數(shù)據(jù)的查詢有個(gè)特點(diǎn),由于數(shù)據(jù)量很大,獲取具體的詳情數(shù)據(jù)意義不大,所以基本都是統(tǒng)計(jì)類的查詢,如:select count(1) cnt,ip from access_log group by ip,查詢每個(gè)ip的訪問次數(shù)。當(dāng)然也可能有查詢?cè)敿?xì)做深度的數(shù)據(jù)分析。

對(duì)于查詢速度當(dāng)然是越快越好,我們可以從以下幾個(gè)方面來提高這個(gè)系統(tǒng)的查詢速度(當(dāng)然緩存不在考慮的范疇內(nèi)),1.查詢系統(tǒng)框架的優(yōu)化,這里可能包含了(執(zhí)行計(jì)劃啊,分布式計(jì)算等等等),2.底層文件存儲(chǔ)格式的優(yōu)化,盡量減少IO.3.當(dāng)然還有索引技術(shù).

針對(duì)上面的sql:select count(1) cnt,ip from access_log group by ip

我們假設(shè)access_log的格式如下: <code> access_log{ string ip; string access_time; ............(其他N個(gè)屬性)

} </code>

如果是行存儲(chǔ):

大數(shù)據(jù)存儲(chǔ)格式parquet是怎樣的

我們需要讀取一行的所有數(shù)據(jù),然后獲取其中的ip字段,在做分組統(tǒng)計(jì)。增加的磁盤的IO,同時(shí)也增加了計(jì)算壓力.

如果是列存儲(chǔ)會(huì)如何: 大數(shù)據(jù)存儲(chǔ)格式parquet是怎樣的

對(duì)于上面的統(tǒng)計(jì),我們只需要讀取IP就可以,讀取不需要的列信息,這就是列存儲(chǔ)對(duì)于大數(shù)據(jù)的統(tǒng)計(jì)類查詢的優(yōu)點(diǎn)所在,當(dāng)然除此之外大數(shù)據(jù)本身的稀疏性,采用列式可能更好的去優(yōu)化存儲(chǔ)結(jié)構(gòu),減少存儲(chǔ)空間.

parquet介紹

parquet是twitter在2013年開源的數(shù)據(jù)結(jié)構(gòu),google的Dremel: [Interactive Analysis of Web-Scale Datasets http://research.google.com/pubs/pub36632.html](Interactive Analysis of Web-Scale Datasets http://research.google.com/pubs/pub36632.html "Interactive Analysis of Web-Scale Datasets http://research.google.com/pubs/pub36632.html").這個(gè)大數(shù)據(jù)查詢利器的paper里面,其實(shí)主要也是在闡述底層文件存儲(chǔ)格式。

Parquet支持復(fù)雜嵌套的數(shù)據(jù)結(jié)構(gòu)組成,并使用重復(fù)級(jí)別/定義級(jí)別(repetition/definition level )的方法來對(duì)數(shù)據(jù)結(jié)構(gòu)進(jìn)行編碼,嵌套的方式其實(shí)可以避免了大數(shù)據(jù)的join問題.

Parquet支持對(duì)某一列數(shù)據(jù)進(jìn)行壓縮,支持任意開發(fā)語言的讀寫操作.目前是apache的頂級(jí)項(xiàng)目.

parquet文件格式分析

首先來看一下如何定義一個(gè)parquet的文件格式,這里也是采用類似PB的格式定義 這里采用了班級(jí)信息來作為示例,有多個(gè)班級(jí),每一個(gè)班級(jí)有個(gè)master,有多個(gè)學(xué)生(可以無),每個(gè)學(xué)生有名稱和多個(gè)愛好,還有每一門可課程的成績(jī)以及課程名稱. schema定義: <code> message classroom{ required string master; repeated group students{ required string name; repeated string hobbys; repeated group coursescore{ required string name; optional string score; } } } </code> required 表示必填 repeated 表示可以有任意個(gè) optional 0 or 1 對(duì)于數(shù)據(jù)可以關(guān)系可以分為Map以及List,如果為L(zhǎng)ist可以采用repeated,Map采用group 關(guān)鍵字修飾.

這里我們來定義一組數(shù)據(jù):

<code> { master:"jack", student: name:"tom" student: name:"joy", hobbys:"basketball", hobbys:"football", coursescore: name:"math", coursescore: name:"chinese", score:100 } { master:"BoBo" } </code>

兩個(gè)班級(jí)一個(gè)有學(xué)生一個(gè)沒有,一個(gè)學(xué)生有愛好有課程,一個(gè)什么也沒有. 我們先來看看如何存儲(chǔ).

存儲(chǔ)

依據(jù)上面定義的schema,可以先轉(zhuǎn)化為一個(gè)tree表示結(jié)構(gòu)

大數(shù)據(jù)存儲(chǔ)格式parquet是怎樣的

只有樹的根節(jié)點(diǎn)是需要實(shí)際存儲(chǔ)的數(shù)據(jù)節(jié)點(diǎn),其余的只是關(guān)系的一種維系。 下圖展示了其嵌套關(guān)系

大數(shù)據(jù)存儲(chǔ)格式parquet是怎樣的

實(shí)際存儲(chǔ)也是這樣,每一列存儲(chǔ)了所有的數(shù)據(jù)信息。是不是存儲(chǔ)很容易。

讀取

既然所有的同一類的數(shù)據(jù)存儲(chǔ)在一起,那么數(shù)據(jù)如何還原為原來的數(shù)據(jù)。這里引入了parquet的元數(shù)據(jù)信息,如何還原數(shù)據(jù)需要 Repetition Level以及Definition Level這兩個(gè)元數(shù)據(jù)信息。

首先我們需要知道哪些數(shù)據(jù)是一組的,其實(shí)還需要知道數(shù)據(jù)和數(shù)據(jù)之間的層級(jí)關(guān)系,OK。這兩個(gè)元數(shù)據(jù)信息可以幫我們搞的.(當(dāng)然也是存儲(chǔ)的時(shí)候?qū)懭氲脑獢?shù)據(jù)信息)

Repetition Level是記錄該列的值是在哪一個(gè)級(jí)別上重復(fù)的。

用剛才的兩個(gè)classroom信息來舉例: 對(duì)于兩個(gè)classroom的master來說,由于都是獨(dú)立的沒有直接關(guān)系,所以他們的Repetition level是0

Jack 0

BoBO 0

對(duì)于jack的學(xué)生tom,joy來說,tom是第一個(gè)學(xué)生,所以level是0,而joy平級(jí),所以是1.

<table> <tr><td>master</td><td>Repetition Level</td><tr> <tr><td>Jack</td><td>0</td><tr> <tr><td>BoBo</td><td>0</td><tr> </table>

<table> <tr><td>student.name</td><td>Repetition Level</td><tr> <tr><td>tom</td><td>0</td><tr> <tr><td>joy</td><td>1</td><tr> <tr><td>null</td><td>2</td><tr> </table>

<table> <tr><td>student.coursescore.score</td><td>Repetition Level</td><tr> <tr><td>null</td><td>0</td><tr> <tr><td>null</td><td>2</td><tr> <tr><td>100</td><td>1</td><tr> </table>

基于Repetition level是可以把原有的數(shù)據(jù)分好類,但是我們現(xiàn)在我們還不知道一條記錄到什么位置STOP,以及數(shù)據(jù)之前的關(guān)系,這個(gè)時(shí)候在引入Definition Level。

這個(gè)時(shí)候在引入Definition Level 是定義的深度,用來記錄該列是否是虛擬出來的。所以對(duì)于非NULL的記錄,是沒有意義的,其值必然為相同。同樣舉個(gè)例子。 比如對(duì)于master來說深度就是0,因?yàn)槭莚equired。

<table> <tr><td>master</td><td>Definition Level</td><tr> <tr><td>Jack</td><td>0</td><tr> <tr><td>BoBo</td><td>0</td><tr> </table>

<table> <tr><td>student.name</td><td>Definition Level</td><tr> <tr><td>tom</td><td>1</td><tr> <tr><td>joy</td><td>2</td><tr> <tr><td>null</td><td>1</td><tr> <table> 通過Definition Level可以還原數(shù)據(jù)的嵌套關(guān)系。

關(guān)于大數(shù)據(jù)存儲(chǔ)格式parquet是怎樣的就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI