why?
1,同一列数据的类型和“材质”是一致的,所以压缩起来更节省空间
2,在按列检索需求下,无需读取整行记录,I/O降低
3,当每一列类型相同时,通过编码能够更好的适应现代处理器分支指令集预测优化
message example as follow
message AddressBook { required string owner; repeated string ownerPhoneNumbers; repeated group contacts { required string name; optional string phoneNumber; } }
通过definition 和 repetition Levels 重建 嵌套的数据结构
为了支持嵌套结构,需要存储field为null的level,对于required,不需要 definition levels
repetition
optional or required fields are never repeated and can be skipped while attributing repetition levels
在数据写入时,对于每一列,
Parquet
都会创建一个
ColumnIO(
含有
columnName,definitionLevel,RepetitionLevel)
和
ColumnWriter
并通过
index
与之对应,
metadata
和
valueData
分开写入。写入
valueData
时,仅写入
value, definitionLevel, RepetitionLevel
的
ByteArray
数据
(
对于字符串类型的数据,编码为
UTF8) DefinitionLevel and RepetitionLevel