简介
Apache Parquet是一种常见的列式存储文件格式,常用于Pig, Spark, Hive等大数据组件中,其后缀是.parquet。
核心特点有:
跨平台可被各种文件系统识别的格式按列存储数据存储元数据下面详细介绍第3、4个特点。
列式存储假设有以下数据表:
#> id name age #> <int> <chr> <dbl> #> 1 1 n1 20 #> 2 2 n2 35 #> 3 3 n3 62如果存储为csv格式,即按行存储,那么:
按行的查询效率就很高。在末尾追加一行效率也很高。如:
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, 重复5次 1, 重复1次 2, 重复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
1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,会注明原创字样,如未注明都非原创,如有侵权请联系删除!;3.作者投稿可能会经我们编辑修改或补充;4.本站不提供任何储存功能只提供收集或者投稿人的网盘链接。 |
标签: #parquet文件格式 #简介Apache #spark