参考
大数据开源列式存储引擎Parquet和ORC
新型列式存储格式 Parquet 详解
读写parquet格式文件的几种方式
Parquet file optional field does not exist
parquet
列存
列存使用场景:数据列很多,且每次操作仅针对若干列的情景
parquet数据存储
schema描述存储结构
有group和primitive两种,用以表示嵌套类型
group 复杂类型,基本处于中间节点,并不存储数据,为虚拟节点
primitive 基本类型,int,String之类,处于叶子节点,存储具体数据
字段属性
required 必须出现1次
repeted 可以出现0次或多次
optional 可以出现0次或1次
数据模型(repetition && definition)
repetition level:表示该数值是在那一层开始出现重复的;0表示一个新的记录;required & optional 无重复含义, 无需该定义;在写入的时候将其理解为该节点和路径上的哪一个repeated节点是不共享的,读取的时候将其理解为需要在哪一层创建一个新的repeated节点,这样的话每一列最大的repeated level值就等于路径上的repeated节点的个数(不包括根节点)
definition level:表示在此路径上有多少可选的field被定义了;required 必须有数据,无需该字段;
(R,D,value)[R表示repetition level;D表示definition level]
文件格式
行组(row group);列块(Column Chunk);页(Page)
parquet与orc对比
parquet能够更好的支持嵌套结构,其最初的设计动机就是存储嵌套式数据,如json,thrift,Protocolbuffer等,将这类数据存储成列式格式
其他方面似乎orc的性能更好
比较方面 | Parquet | orc |
---|---|---|
发展状态 | 目前都是Apache开源的顶级项目,列式存储引擎 | |
开发语言 | Java | java |
主导公司 | Twitter/Cloudera | Hortonworks |
列编码 | 支持多种编码,字典,RLE,Delta等 | 支持主流编码,与Parquet类似 |
ACID | 不支持 | 支持ACID事务 |
修改操作(update,delete等) | 不支持 | 支持 |
支持索引(统计信息) | 粗粒度索引,bolck/group/chunk级别统计信息 | 粗粒度索引,file/Stripe/row级别 |
查询性能 | orc稍好 | |
数据压缩能力 | orc好一些 | |
支持的查询引擎 | Apache Drill/impala | Apache hive |
在mapreduce中简单使用parquet