# 4. Nested Columnar Storage ![500](https://img.jonahgao.com/oss/note/2025p1/dremel_nested_1.png) ![500](https://img.jonahgao.com/oss/note/2025p1/dremel_nested_2.png) ## 4.1 Repetition and Definition Levels - 单独的 values 无法反映 record 的结构 - 比如给出两个 values,无法分辨是两个不同的 record,还是相同 record 的两个重复 values ### Repetition levels - 路径上有多少个 field 是 repeated 的(比如为 2),则 repetition level 的范围为 $[0, 2]$ - 0 表示是 new record 的起始 - r1 的第二个 Name 中不包含 Code values,但需要添加 NULL,避免接下来的 code (en-gb) 被认为是 第二个 Name 的 ### Definition levels - 路径上可能有多个 field 是可以不定义的即 **undefined**(声明为 optional 或者 repeated) - 如 Name.Language.Country 三个级别都可以为 NULL,则 definition level 最大为 3 - 问题:当发现一个 NULL 值时,如何确定是哪个级别导致的 - 为 value 存储 definition level:路径上不为空的 field 个数(只统计 optional 或者 repeated fields) - 非 NULL values 的 d 等于路径上的 max definition level - 即 d 小于 max definition level 的都为 NULL 值 ### Encoding - values 如果永远是 defined 的,则可以不存储 definition level - 类似地,repetition levels 也可以不存储,例如 definition level 0 蕴含了 repetition level 为 0 - 只使用必要的 bits,例如 maximum definition level 是 3, 则每个 definition level 使用 2 个 bits 表示 ## 4.2 Splitting Records into Columns - repetition and definition levels may need to be computed even if field values are missing - 用 NULL 占位