Parquet 嵌套学习笔记

本文介绍了Parquet文件格式中嵌套列表的表示方法,详细解释了repetition levels和definition levels的概念及其作用,并通过具体例子展示了如何利用这些级别构建正确的记录。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

 

一. parquet 嵌套列表示

二. Definition levels && Repetition levels

2.1 定义

2.2 例子

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.

三. 参考

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值