1.Parquet檔案格式介紹
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檔案格式如圖1:
圖1:parquet檔案的格式結構
Parquet檔案在磁盤上的分布情況如圖2所示。所有的資料被水準切分成Row
group,一個Row group包含這個Row
group對應的區間内的所有列的column chunk。一個column
chunk負責存儲某一列的資料,這些資料是這一列的Repetition levels, Definition levels和values(詳見後文)。一個column
chunk是由Page組成的,Page是壓縮和編碼的單元,對資料模型來說是透明的。一個Parquet檔案最後是Footer,存儲了檔案的中繼資料資訊和統計資訊。Row group是資料讀寫時候的緩存單元,是以推薦設定較大的Row
group進而帶來較大的并行度,當然也需要較大的記憶體空間作為代價。一般情況下推薦配置一個Row group大小1G,一個HDFS塊大小1G,一個HDFS檔案隻含有一個塊
圖2:檔案在磁盤上的分布
2.Parquet的讀寫
parquet寫的時候需要指定schema,讀的時候會自動識别schema
每一個字段有三個屬性:重複數、資料類型和字段名,重複數可以是以下三種:
required(出現1次)
repeated(出現0次或多次)
optional(出現0次或1次)
資料類型有:
INT64, INT32, BOOLEAN, BINARY(字元串), FLOAT, DOUBLE, INT96, FIXED_LEN_BYTE_ARRAY
例如:
private static String schemaStr = "message schema {" + "repeated int64 rowkey;"
+"repeated int64 family;"+ "repeated int64 colume;"+"repeated int64 value;}";
static MessageType schema = MessageTypeParser.parseMessageType(schemaStr);
具體代碼詳見另一篇:https://blog.csdn.net/qiangzi_lg/article/details/86676538
文章摘自:https://www.jianshu.com/p/b823c727fe46和https://www.cnblogs.com/yangsy0915/p/5565309.html