Parquet是面向分析型業務的列式存儲格式,由Twitter和Cloudera合作開發,2015年5月從Apache的孵化器里畢業成為Apache頂級項目,那么這里就總結下Parquet數據結構到底是什么樣的呢?
一個Parquet文件是由一個header以及一個或多個block塊組成,以一個footer結尾。header中只包含一個4個字節的數字PAR1用來識別整個Parquet文件格式。文件中所有的metadata都存在於footer中。footer中的metadata包含了格式的版本信息,schema信息、key-value paris以及所有block中的metadata信息。footer中最后兩個字段為一個以4個字節長度的footer的metadata,以及同header中包含的一樣的PAR1。
讀取一個Parquet文件時,需要完全讀取Footer的meatadata,Parquet格式文件不需要讀取sync markers這樣的標記分割查找,因為所有block的邊界都存儲於footer的metadata中(因為metadata的寫入是在所有blocks塊寫入完成之后的,所以吸入操作包含的所有block的位置信息都是存在於內存直到文件close)
這里注意,不像sequence files以及Avro數據格式文件的header以及sync markers是用來分割blocks。Parquet格式文件不需要sync markers,因此block的邊界存儲與footer的meatada中。
在Parquet文件中,每一個block都具有一組Row group,她們是由一組Column chunk組成的列數據。繼續往下,每一個column chunk中又包含了它具有的pages。每個page就包含了來自於相同列的值.Parquet同時使用更緊湊形式的編碼,當寫入Parquet文件時,它會自動基於column的類型適配一個合適的編碼,比如,一個boolean形式的值將會被用於run-length encoding。
另一方面,Parquet文件對於每個page支持標准的壓縮算法比如支持Snappy,gzip以及LZO壓縮格式,也支持不壓縮。
Parquet格式的數據類型:
參考: 《Hadoop:The Definitive Guide, 4th Edition》