让我们直入主题,讨论 parquet 文章里最常见各种翻译文章介绍 level 说的语焉不详,让人迷迷糊糊。
Repetition Level
定义:本质是为了在还原顺序记录时,能够处理重复字段的问题。
前提:对于一个 record,每个字段有一个 path,即从 record 到该字段的所有嵌套字段的拼接。
怎么算:(record 中第一个 field 是 0 不讨论)重复字段出现时,找到 path 中最后一个在重复的字段,这个字段在 path 的所有可重复(repeated)字段中的次序,就是 level 值。
其实论文本身给的例子非常充分了,但是但是缺少一些细节解释。
这个例子直接给出了三种 level 值计算方式:
- 对于
Name.Language.Code: 'en'
,最后一个重复的字段是 Language(重复的空间是所属 Name),而这个 path 中,Name 和 Language 都是 repeated ,因此 level 值为 2; - 对于
Name.Language.Code: 'gb'
,注意最后一个重复字段是 Name (重复空间是整个 record),同理,level 值为 1; - 对于
Links.Forward: 40
,这个形式对于理解最为关键,最后一个重复的字段是 Forwards,论其在 path 中的序号是 2,但 Links 本身不是 repeated,所以此时 Forwards 是 path 中第一个 repeated,因此 level 值为 1。
其实,parquet 作者的另一幅图很能说明这个逻辑:
Definition Level
这个似乎相对更简单,简单一句话:最后一个 optional/repeated 字段在 path 中的序号即可。