简单理解parquet文件格式——按列存储和元数据存储

简介

Apache Parquet是一种常见的列式存储文件格式,常用于Pig, Spark, Hive等大数据组件中,其后缀是.parquet。

核心特点有:

  1. 跨平台
  2. 可被各种文件系统识别的格式
  3. 按列存储数据
  4. 存储元数据

下面详细介绍第3、4个特点。

列式存储

假设有以下数据表:

#>      id name    age
#>   <int> <chr> <dbl>
#> 1     1 n1       20
#> 2     2 n2       35
#> 3     3 n3       62

如果存储为csv格式,即按行存储,那么:

  1. 按行的查询效率就很高。
  2. 在末尾追加一行效率也很高。

如:

SELECT * FROM table_name WHERE id == 2

只需要找到第2行,把这一行所有数据取出来即可。

但是,如果想对age列求和,效率就低了,需要遍历每一行,从每行中找出哪个值是年龄。

Parquet 使用列式存储,形式如下:

1 2 3
n1 n2 n3
20 35 62

这时想对age列求和,只需要把最后一行的值加起来即可,效率很高。

但相对的,按行的查询效率就低了。

存储元数据(数据压缩)

由于parquet是按列存储的, 相同格式的数据存储在一起,就有了很大优化空间。

Run Length Encoding

假设某列只包含某一个重复值,只需记录“值x重复了n次”。

如果包含了多个重复值,只需要添加一个查找表即可。

如一列数据:

4 4 4 4 4 1 2 2 2 2

可以存储为:

4, 重复51, 重复12, 重复4

Dictionary Encoding

假设有一列字符串:

"Jumping Rivers" "Jumping Rivers" "Jumping Rivers"

只需要把"Jumping Rivers"用0表示,再存储0到"Jumping Rivers"的映射关系:

0 0 0
0 -> "Jumping Rivers"

比如存储10^6个"Jumping Rivers",parquet只需要1.09K,而csv需要14.31M。

Delta Encoding

这种编码主要用于存储timestamps。时间戳是1970年1月1日以来经过的秒数,如:

"2021-09-21 17:05:08 BST"

表示为:

1632240309

其实不需要记录这么大的数字,只需要记录和最小时间戳的差值即可,如:

1628426074 1628426078 1628426080

记录为:

0 4 6

即可。

其它编码

详见https://github.com/apache/parquet-format/blob/master/Encodings.md

参考

Understanding the Parquet file format

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值