简介

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, 重复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

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

  1. Flink大数据实时计算系列-列式存储parquet文件格式介绍、Flink进行rowformat格式文件保存

    Flink大数据实时计算系列-列式存储parquet文件格式介绍 Flink进行rowformat格式文件保存 列式存储parquet文件格式介绍

  2. NoSQL生态系统——类似Bigtable列存储,或者Dynamo的key存储(kv存储如BDB,结构化存储如redis,文档存储如mongoDB)...

    摘自:http://www.ituring.com.cn/article/4002# NoSQL系统的数据操作接口应该是非SQL类型的.但在NoSQL社区,NoSQL被赋予了更具有包容性的含义,其意为 ...

  3. 人工智能:深度学习算法及应用——简单理解CNN卷积神经网络并python实现(带源码)

    深度学习算法及应用 一. 实验目的 二. 实验要求 三. 实验的硬件.软件平台 四. 实验原理 1.1. 深度学习概述 1.2. 深度学习的常见结构 1.3. 卷积神经网络(CNN) **卷积** * ...

  4. Android:安卓学习笔记之Bitmap的简单理解和使用

    Android Bitmap的简单理解和使用 Android Bitmap 一.Bitmap的定义 二.Bitmap的格式 2.1 存储格式 2.2 压缩格式 三.Bitmap创建方法 3.1 Bit ...

  5. c语言为什么先存储行后存储列,C语言行优先和列优先的问题深入分析

    C语言行优先和列优先的问题深入分析 摘要 本文主要探讨的是"行优先"原则和"列优先"原则的问题. 1. 背景 首先了解"行优先"和" ...

  6. 列存储、行存储之间的关系和比较

    目录(?)[-] 一定义 定义 优点 场合 发展史 二sysbase iq 列存储介绍 列存储 数据压缩 索引 Low Fast 索引 Bit-Wise索引 High Group索引 Word 索引 ...

  7. 【转载】Deep learning:十九(RBM简单理解)

    Deep learning:十九(RBM简单理解) 这篇博客主要用来简单介绍下RBM网络,因为deep learning中的一个重要网络结构DBN就可以由RBM网络叠加而成,所以对RBM的理解有利于我 ...

  8. 数据结构的简单理解(4)

    总结: 数据的逻辑结构.数据的存储结构及数据的运算这三方面是一个整体.孤立地去理解一个方面,而不注意它们之间的联系是不可取的. 逻辑结构可以分为:线性结构和非线性结构. 对于一些现实数据项,在讨论其数 ...

  9. linux文件系统只有几k,关于Linux文件系统的的简单理解和认识

    关于Linux文件系统的的简单理解和认识 关于文件系统的运作,这与操作系统带的档案数据有关.例如Linux操作系统的档案权限(rwx)与文件属性(拥有者,群组,时间参数等).文件系统通常会将这两部分的 ...

最新文章

  1. hibernate3
  2. 【Java 泛型】泛型用法 ( 泛型类用法 | 泛型方法用法 | 泛型通配符 ? | 泛型安全检查 )
  3. windows64位环境下python安装numpy、scipy和matplotlib
  4. 在文件中读取列表功能
  5. 揭秘全球开发最新趋势!JS开发者达1380万,C#超越PHP,Rust增长最快
  6. [Redux/Mobx] 什么是redux?说说你对redux的理解?有哪些运用场景?
  7. FreeSql (二十)多表查询 WhereCascade
  8. 适合新手学习的laravel接入微信接口,实现微信公众号二次开发
  9. 机器学习基础(三十二) —— 使用 Apriori 算法进行关联分析
  10. 简单了解一下如何使用Spring框架里JDBC和事务
  11. 一个OA系统升级实施方案
  12. 路飞学城Python-Day78
  13. J.Serval and Essay(tarjan求拓扑序)
  14. 亲手打造自己的 Linux 桌面环境
  15. Unity3D射击类游戏制作第三节--游戏模型
  16. JDK8——IntStream
  17. python人工智能应用实例_Python实现AI自动抠图实例解析
  18. 设备维护管理的内容是什么?这四点你必须知道
  19. Packetdrill(网络协议测试工具)
  20. 中文文本分析, Text-Analysis

热门文章

  1. 假如有人欺骗了你•••
  2. java中easyUI开发环境搭建
  3. 网站安全防护与漏洞扫描的关系
  4. 用算法模拟演变机器人“进化”!MIT开发新平台,还能优化机器人身体和大脑,已开源...
  5. Soot入门(1): 安装与生成Jimple文件
  6. 技术胖前端学习路线学习笔记【更新中】
  7. scala中的高阶函数_Scala中的高阶函数(HOF)
  8. 生命线检查计算机还是连接线,生命线和智慧线相连起始段成锁链纹代表什么
  9. 顺序表的直接插入排序-----数据结构与算法笔记
  10. 程序员内功心法之程序环境和预处理