paruet列存文件结构图:
如上图,文件由一个或者多个行组Row Group组成,每个行组由多个列组成,每个列由多个页面组成,页面由其头部和Repetition levels、Definition levels和列的值values组成。
以上结构可以在加载时追加record,record首先存在内存中,当内存不够用时,将此时内存中所有的record组成一个行组Row Group输出到文件中,内存清空。
而在avro列存中没有行组的概念,只能将所有record全部加载到内存中,然后一起写到disk中。
parquet是可以存储嵌套属性的,实现这一点,Repetition levels和Definition levels很重要。以下是对这两个值的介绍。
Definition levels表示,在这条嵌套路径上repeated field和optional field不为null的个数,不包括required field。
Repetition levels表示,这个值是在嵌套路径上的哪个级别新建,针对repeated field。
以下是一个嵌套的avro中schema例子,record A嵌套record B数组嵌套record C数组。
{"name": "A", "type": "record",
"fields": [
{"name": "a", "type": "string"},
{"name": "nestArray1",
"type": {"type": "array",
"it