目录
二. Definition levels && Repetition levels
2.3 生成具有 repetition levels 和 definition levels 的 column strips
一. parquet 嵌套列表示
为了编码嵌套列,parquet 使用 group, repeated 来表示一个类似于 struct 和 list 的概念。
比如这个 Document 的定义了一个嵌套列。
其中
- required 代表这个字段是必须的。
- optional 代表这个字段是可选的。
- repeated 代表可以重复。
二. Definition levels && Repetition levels
2.1 定义
为了编码嵌套列,parquet 使用 dremel 通过 definition levels 和 repetition levels 来实现。
- Repetition levels: specify at what repeated field in the path has the value repeated.
- Definition levels: specify how many optional fields in the path for the column are defined.
比如 a.b.c 字段
- 字段 path 就是 a.b.c
- Repetition levels 用来表示字段 path 中那个部分是重复的。如果在 a 上已经重复了,那么 level = 1;b 上 level = 2, c 上 level = 3.
- Definition levels 用来看看字段 path 中多少可选字段部分(包括 optional 和 repeated)是定义的,求个和。
- 有了repeated level 我们就可以构造出一个记录了,为什么还需要definition levels呢?由于repeated和optional 类型的存在,可能一条记录中某一列是没有值的,假设我们不记录这样的值就会导致本该属于下一条记录的值被当做当前记录的一部分,从而造成数据的错误,因此对于这种情况需要一个占位符标示这种情况。如果value是null,而rl,dl会存,导致下面的值错位上来了。
2.2 例子
参考 《Dremel: Interactive Analysis of Web-Scale Datasets》论文里面的例子:
其中 r 代表 repetition levels:
来看 Name.Language.Code 的 repetition levels。对未定义字段进行补 NULL。
- en-us 0: Name.Language.Code 中没有一部分是重复了,所以为 0.
- en 2: Name.Language.Code 中 Language 重复了,是路径的第 2 个层,所以为 2.
- NULL 1: Name.Language.Code 中 Name 重复了,是路径的第 1 个层,所以为 1.
- en-gb 1: Name.Language.Code 中 Name 重复了,是路径的第 1 个层,所以为 1.
- NULL 1: Name.Language.Code 没有一部分重复了,所以为 0.
来看 Name.Language.Country 的 repetition levels。对未定义字段进行补 NULL。
- us 0: Name.Language.Country 中没有一部分是重复了,所以为 0.
- NULL 2: Name.Language.Country 中 Language 重复了,是路径的第 2 个层,所以为
- NULL 1: Name.Language.Country 中 Name 重复了,是路径的第 1 个层,所以为 1.
- gb 1: Name.Language.Country 中 Name 重复了,是路径的第 1 个层,所以为 1.
- NULL 0: Name.Language.Code 中没有一部分重复了,所以为 0.
其中 d 代表 definition levels。
来看 Name.Language.Code 的 definition levels。对未定义字段进行补 NULL。Name Language Code 中 Name 和 Language 都是可选字段(能出现 0 次,optional 和 repeated),Code 是 required 字段。
- en-us 2: Name.Language.Code 中 Name,Language 都出现了,所以为 2.
- en 2: Name.Language.Code 中 Name,Language 都出现了,所以为 2.
- NULL 1: Name.Language.Code 中 只有 Name 出现了,所以为 1.
- en-gb 2: Name.Language.Code 中 Name,Language 都出现了,所以为 2.
- NULL 1: Name.Language.Code 中 只有Name 出现了,所以为 1.
来看 Name.Language.Country 的 definition levels。对未定义字段进行补 NULL。Name Language Country 中 Name, Language, Country都是可选字段(能出现 0 次,optional 和 repeated),Country 是 required 字段。
- us 3: Name.Language.Country 中 Name,Language, Country 都出现了,所以为 3.
- NULL 2: Name.Language.Code 中 Name,Language 都出现了,所以为 2.
- NULL 1: Name.Language.Code 中 只有 Name 出现了,所以为 1.
- gb 3: Name.Language.Code 中 Name,Language, Country 都出现了,所以为 3.
- NULL 1: Name.Language.Code 中 只有Name 出现了,所以为 1.
2.3 生成具有 repetition levels 和 definition levels 的 column strips
可以参考下面文章中的例子。
https://blog.twitter.com/engineering/en_us/a/2013/dremel-made-simple-with-parquet
如何通过图中右边的R,D,Value构建出记录。
这边我就不翻译了,因为感觉翻译了可能还不如保留原文的效果好。
column: contacts.phoneNumber
To reconstruct the records from the column, we iterate through the column:
● R=0, D=2, Value = “555 987 6543”:
○ R = 0 means a new record. We recreate the nested records from the root until the definition level (here 2)
○ D = 2 which is the maximum. The value is defined and is inserted.
● R=1, D=1:
○ R = 1 means a new entry in the contacts list at level 1.
○ D = 1 means contacts is defined but not phoneNumber, so we just create an empty contacts.
● R=0, D=0:
○ R = 0 means a new record. we create the nested records from the root until the definition level.
○ D = 0 => contacts is actually null, so we only have an empty AddressBook.
三. 参考
- 《Dremel: Interactive Analysis of Web-Scale Datasets》
- https://blog.twitter.com/engineering/en_us/a/2013/dremel-made-simple-with-parquet