最近一个月被两个小主折磨得七荤八素的,真是一对甜蜜的负担。生活还要继续,最近先转几篇高质量的文章,后续要恢复写作了,大家有什么想看的,可以私信我。

---------------------------------正文分割线--------------------------------

Parquet 是一种面向分析的、通用的列式存储格式,兼容各种数据处理框架比如 Spark、Hive、Impala 等,同时支持 Avro、Thrift、Protocol Buffers 等数据模型。

Parquet 作为 HDFS 存储格式的事实标准,经常用在离线数仓、OLAP 等场景。本文整理于最近的一次公司内训,主要分四个部分:

1、Parquet 简介

2、架构解析

3、基本操作

4、TPC-DS 基准测试介绍

Parquet 简介

第一部分内容介绍了此次 Parquet 分享的技术背景,行存与列存的区别,以及 Parquet 的特点。

为什么要进行这次 Parquet 讲解?

主要因为 Parquet 在一个项目中重度使用,开发人员对其原理、操作不是很清楚,项目上是使用 Parquet 做离线数仓,计算层使用 Spark SQL 进行离线分析构建企业的标签系统,结果数据落地到 Elasticsearch。

Parquet可以说是一个列式存储系统。关于行存与列存的区别可以简单用下图描述,列存在 IO 方面比行存有很大优势,能够减少扫描数据量。

Parquet 的特点概况的说主要体现在:

  • 列裁剪与谓词下推:列裁剪,意思是只读取需要的列,实现高效的列扫描,减少 IO 操作;谓词下推,可以过滤掉不符合条件的数据,只读取需要的数据,进一步减少 IO 操作。

  • 更高效的压缩与编码:因为同一列的数据类型相同,所以可以针对不同列使用更合适的压缩与编码方式,降低磁盘存储空间。

另外,Parquet也是Spark SQL 的默认数据源,可通过参数spark.sql.sources.default 进行配置。

架构解析

1、技术架构


Parquet 是 Apache 的顶级项目,整体技术架构如下图

Parquet 主要包含以下 5 个主要模块:

  • parquet-format:定义了所有格式规范,以及由 Thrift 序列化的元数据信息等。

  • parquet-mr:包括多个实现了读写 Parquet 文件的功能模块,并且提供一些和其它组件适配的工具,例如Hadoop Input/Output Formats、Pig loaders、Hive Serde等。

  • parquet-cpp:用于读写 Parquet 文件的 C++ 库。

  • parquet-rs:用于读写 Parquet 文件的 Rust 库。

  • parquet-compatibility:包含验证不同语言之间读写 Parquet 文件的兼容性测试等。

2、数据模型

Parquet 是一种支持嵌套的数据模型,和 Protocol Buffers 的数据模型类似,它的 schema 就是一个嵌套 message。

每个 schema 包含多个字段,每一个字段又可以包含多个字段,每一个字段有三个属性:repetition、type 和 name,其中 repetiton 可以是以下三种:required(出现1次),repeated(出现0次或多次),optional(出现0次或1次)。每一个字段的数据类型可以分成两种:group(复杂类型)和 primitive(基本类型)。一个如下的 Parquet Schema 示意图

如果用代码表示就是:

message AddressBook  {required string owner;repeated string ownerPhoneNumbers;repeated group contacts {  required string name;  optional string phoneNumber;}
}

3、文件格式

下面是 Parquet 官网给出的文件格式图解:

从如上文件结构可以看出,Parquet 格式可以从以下几个部分理解:

  • 文件(File):一个 Parquet 文件,包括数据和元数据,如果在 HDFS 之上,数据就是分散存储在多个 HDFS Block 中。

  • 行组(Row Group):数据在水平方向上按行拆分为多个单元,每个单元就是所谓的 Row Group,即行组。这是一般列式存储都会有的结构设计。每一个行组包含一定的行数,Parquet 读写的时候会将整个行组缓存在内存中,因此更大尺寸的行组将会占用更多的缓存,并且记录占用空间比较小的 Schema 可以在每一个行组中存储更多的行。

  • 列块(Column Chunk):一个行组中的每一列对应的保存在一个列块中。行组中的所有列连续的存储在这个行组文件中,每一个列块中的值都是相同类型的,不同列块可能使用不同的算法进行压缩。

  • 数据页(Data Page):每一个列块划分为多个数据页或者说页,一个页是最小的编码的单位,在同一个列块的不同页可能使用不同的编码方式。

Parquet 文件有三种类型的元数据,分别是file metadata、column(chunk) metadata、page header metadata,每部分元数据包含的信息从上面图解中大概可以得知。

此外,值得说明的是文件 header 部分中的 Magic Number,它的作用主要是为了做文件校验,验证文件是否是一个Parquet文件。

基本操作


1、通过 Hive 创建 Parquet 表

· 标准建表语句。举一个最简单的建表示例,如下:

create table t1 (id int) stored as parquet;

· 通过 TextFile 表创建 Parquet 表。这是离线数仓中的常规操作,假设已经准备好了一张 TextFile 表 catalog_sales,在 hive shell 命令行中演示如下操作:

-- 创建parquet表(不压缩)> drop table if exists catalog_sales_par;> create table catalog_sales_par stored as parquet as select * from catalog_sales;-- 设置parquet为snappy压缩> set parquet.compression=SNAPPY;> create table catalog_sales_par_snappy stored as parquet as select * from catalog_sales;-- 设置parquet块大小> set parquet.block.size=268435456;> create table catalog_sales_par_snappy2 stored as parquet as select * from catalog_sales;

2、查看 Parquet 文件 Schema 

假如现在我们手上有一份 Parquet 文件,但是并没有人告知我们它对应的 schema 信息,这个时候怎么才能快速知道它的 schema 等信息呢?

其实 Parquet 原生提供了一个工具模块,这个工具可以很方便的查看本地或 HDFS 上的 Parquet 文件信息。不仅仅是 schema,还包括其他信息,按照下面使用方法中的帮助提示即可。

下载地址:

https://www.mvnjar.com/org.apache.parquet/parquet-tools/jar.html

使用方法:

#Run from Hadoop
hadoop jar ./parquet-tools-<VERSION>.jar --help
hadoop jar ./parquet-tools-<VERSION>.jar <command> my_parquet_file.par#Run locally
java jar ./parquet-tools-<VERSION>.jar --help
java jar./parquet-tools-<VERSION>.jar <command> my_parquet_file.par

实际测试:下载 parquet-tools-1.8.0.jar 工具包,上传到集群节点并读取 HDFS 上的一个 Parquet 文件:

TPC-DS 基准测试介绍

TPC-DS 是标准的大数据基准测试,采用星型、雪花型等多维数据模式,提供与真实数据一致的数仓数据以及符合实际的工作负载。提供的数据集包含 24 张表,其中 7 张事实表,17 张维度表,平均每张表含有18列。事实表的表名分别是 catalog_returns、catalog_sales、inventory、promotion、store_returns、store_sales、web_returns、web_sales。工作负载包含 99 个 SQL 查询,覆盖SQL99 和 2003 的核心部分以及 OLAP。

这里提前编译好了一版 TPC-DS 包,并使用它在本地生成 10 GB 的样本数据,命令如下:

$cd ~/training/tpcds/v2.3.0/tools
$nohup ./dsdgen -scale 10 -dir ~/data_10g &

然后使用它提供的 Q20 简单测试一下 TextFile 与 Parquet 格式数据的查询性能。更多的性能测试这里不多描述了。

Apache Parquet 干货分享相关推荐

  1. Apache Parquet 技术干货分享

    Parquet 是一种面向分析的.通用的列式存储格式,兼容各种数据处理框架比如 Spark.Hive.Impala 等,同时支持 Avro.Thrift.Protocol Buffers 等数据模型. ...

  2. 【深圳(活动)】70多场干货分享!价值899元的2018中国开源年会门票等你认领

    开源发展20年,.NET Core开源 4年时间,.NET开源实现Mono也有18年的时间,特别近年国内.NET Core社区的蓬勃发展,.NET Core中国社区作为中国开源社区的重要参与者,获得官 ...

  3. 干货分享 | 自然语言处理及词向量模型介绍(附PPT)

    云脑科技机器学习训练营第二期,对自然语言处理及词向量模型进行了详细介绍,量子位作为合作媒体为大家带来本期干货分享~ 本期讲师简介 樊向军 云脑科技核心算法工程师,清华大学学士,日本东京大学与美国华盛顿 ...

  4. Netty干货分享:京东京麦的生产级TCP网关技术实践总结

    1.引言 京东的京麦商家后台2014年构建网关,从HTTP网关发展到TCP网关.在2016年重构完成基于Netty4.x+Protobuf3.x实现对接PC和App上下行通信的高可用.高性能.高稳定的 ...

  5. 报道 | 本科4篇顶会论文如何做到?清华特奖干货分享:我是这样写论文、做实验、与导师相处...

    ↑↑↑↑↑点击上方蓝色字关注我们! 『视学算法』转载 作者:量子位 编者按: 清华本科特奖获得者.清华计算机大四学生高天宇的顶会论文干货分享,手把手教你打开本科生/嗑盐小白科研之门的门钥匙. 本科生, ...

  6. 数据库迁移_【干货分享】DM数据库迁移方法(物理迁移)

    在数据库的维护过程中,可能涉及换服务器,或者需要现网数据库环境测试的情况,这时,最简单快速的办法就是将源数据库相关的文件拷贝到目标主机,然后注册数据库实例服务.这就是数据库的物理迁移过程,可以是从wi ...

  7. 位图排序 大数据_干货分享:大话12种排序算法

    干货分享:大话12种排序算法 常见的排序算法: 快速排序.堆排序.归并排序.选择排序 插入排序.二分插入排序 冒泡排序.鸡尾酒排序 桶排序.计数排序.基数排序.位图排序 技能点: 1.归并排序在O(N ...

  8. 揭秘百度核心技术:53位专家纯干货分享

    2019独角兽企业重金招聘Python工程师标准>>> 揭秘百度核心技术:53位专家纯干货分享 百度--中国互联网三大巨头之一,全球最大的中文搜索引擎,拥有着中国大部分上网者的上网入 ...

  9. dm7和mysql_【干货分享】达梦数据库DM7的新特性发布啦

    原标题:[干货分享]达梦数据库DM7的新特性发布啦 近日,DM7正式发布新特性.作为一款广受业内人士认可的国产数据库产品,最突出的特征就是它良好的兼容性,完善的功能以及超出客户期望的优秀性能表现:本次 ...

最新文章

  1. 《OpenCV3编程入门》学习笔记5 Core组件进阶(四)图像对比度、亮度值调整
  2. Android开发之Dialog的三种列表显示(解读谷歌官方API)
  3. HTML行间距的设置方法
  4. Winform 导出成Excel打印代码
  5. 专访 | PP云技术副总监:如何使用机器学习算法优化分发链路
  6. 为什么虚拟机上一运行就显示程序停止_五分钟学Java:如何学习Java面试必考的JVM虚拟机||CSDN博文精选...
  7. 法兰克机械手手动操作_吸盘搬运机械手,一步解决玻璃搬运难题!
  8. android wchar t 中文,Android没有真正的wchar_t吗?
  9. Python程序-生成回文
  10. Magnet :让Mac上的分屏更好用
  11. 积分简明笔记-第二类曲线积分的类型
  12. 【教程】CoreAVC+Haali安装及设置简易教程(KMPlayer)(4)
  13. matlab曲面的最小值,MATLAB最小二乘法拟合曲面
  14. iOS开发——APP回退到历史版本
  15. 【mysql】复制一张表的数据到另一张表
  16. springboot项目启动报Ambiguous mapping. Cannot map ‘xxxController‘ method
  17. 清理垃圾文件属于计算机安全维护吗,垃圾文件清理,垃圾文件清理器
  18. 高中数学集合知识点小题解题方法
  19. 51单片机学习笔记——SH88F4051A
  20. 做自己的神——极高自由度的功能游戏:我的世界

热门文章

  1. spark中读取json_【spark】文件读写和JSON数据解析
  2. unity gaia 自定义高程图无法识别解决方法
  3. Origin如何进行数据描述以及正态性分析
  4. spi通信c语言发送32字节数据,AVR单片机SPI通讯实例程序 (C - ARM - 电子发烧友网
  5. 小红书新一轮洗牌,品牌投放如何制胜?
  6. 被老干妈“骗了”1600w的腾讯,这波不亏反赚?
  7. 每日新闻:2018电信和互联网行业网络安全检查工作开始;清华研发“电子皮肤” 可测人体信号...
  8. 通过TLINK物联网平台和迈思德网关DIY制作APP实现PLC远程无线监控
  9. 微信小程序webview与h5通过postMessage实现实时通讯的实现
  10. 调整echarts中图与legend的距离