列式文件,顾名思义就是按列存储到文件,和行式存储文件对应。保证了一列在一个文件中是连续的。下面从parquet常见术语,核心schema和文件结构来深入理解。最后通过java api完成write和read。
术语
block
parquet层面和row group是一个意思
row group
逻辑概念,用于对row进行分区。由数据集中每个column的column chunk组成。是读写过程中的缓存单元,一般在hdfs上推荐一个block为1GB,一个HDFS文件1个bolock
column chunk
某个column的所有数据被称为column chunk,存在与row group,并保证在文件中是连续的
page
多个column chunk之间用page分开,也就是说一个page只会包含一个column的数据,一个page是一个独立的单元(可以被编码或者压缩)
dictionary page
每个page之前都可以选择是否需要dictionary page。dictionary page记录了该page所有不同的值。这可以增强处理速度提高压缩率。
总结
一个文件由多个row group组成,一个row group包括了多个column chunk,一个column chunck就是某个column的所有数据集, 被分割成多个page,一个page是最小的处理单元,可以被编码或者压缩。
schema
每种文件都有自己特有的规则,像csv文件,是用分隔符分隔开的一个个列。parquet文件也有自己独特的schema格式。
这是一个parquet文件的schema例子,对应的api是MessageType
message person{ required binary name (UTF8); required int age; repeated group family{ required binary father (UTF8); required binary mother (UTF8); optional binary sister (UTF8); } }