在Hive中,为我们提供了五种文件存储格式

  • 1、Textfile
  • 2、Sequencefile
  • 3、Rcfile
  • 4、Orcfile
  • 5、Parquet
    这里主要介绍一下Parquet,列式存储
一、概念

1、Apache Parquet是Hadoop生态圈中一种新型列式存储格式,它可以兼容Hadoop生态圈中大多数计算框架(Mapreduce、Spark等),被多种查询引擎支持(Hive、Impala、Drill等),并且它是语言和平台无关的。Parquet最初是由Twitter和Cloudera合作开发完成并开源,2015年5月从Apache的孵化器里毕业成为Apache顶级项目。
2、Parquet 配合的组件
查询引擎: Hive, Impala, Pig, Presto, Drill, Tajo, HAWQ, IBM Big SQL
计算框架: MapReduce, Spark, Cascading, Crunch, Scalding, Kite
数据模型: Avro, Thrift, Protocol Buffers, POJOs
3、Parquet最初的灵感来自Google于2010年发表的Dremel论文,文中介绍了一种支持嵌套结构的存储格式,并且使用了列式存储的方式提升查询性能,在Dremel论文中还介绍了Google如何使用这种存储格式实现并行查询的。
4、Parquet文件是以二进制方式存储的,所以不可以直接读取,和ORC一样,文件的元数据和数据一起存储,所以Parquet格式文件是自解析的

二、Parquet数据模型


上图展示了一个Parquet文件的内容,一个文件中可以存储多个行组,文件的首位都是该文件的Magic Code,用于校验它是否是一个Parquet文件,Footer length记录了文件元数据的大小,通过该值和文件长度可以计算出元数据的偏移量,文件的元数据中包括每一个行组的元数据信息和该文件存储数据的Schema信息。除了文件中每一个行组的元数据,每一页的开始都会存储该页的元数据,在Parquet中,有三种类型的页:数据页、字典页和索引页。数据页用于存储当前行组中该列的值,字典页存储该列值的编码字典,每一个列块中最多包含一个字典页,索引页用来存储当前行组下该列的索引,目前Parquet中还不支持索引页。

Parquet文件在磁盘所有数据分成多个RowGroup 和 Footer。
1、RowGroup(行组): 真正存储数据区域,每一个RowGroup存储至少一个ColumnChunk的数据。
2、ColumnChunk(列块):在一个行组中,每一列的数据保存在一个列块中(就代表当前RowGroup某一列的数据),并且一个列块中的值都是相同类型的,不同的列块可能使用不同的算法进行压缩。ColumnChunk至少包含一个Page。
3、Page(页):是压缩和编码的最小单元,每一个列块划分为多个页,主要包括PageHeader,RepetitionLevel,DefinitionLevel和Values.
4、PageHeader: 包含一些元数据,诸如编码和压缩类型,有多少数据,当前page第一个数据的偏移量,当前Page第一个索引的偏移量,压缩和解压的大小
5、DefinitionLevel: 当前字段在路径中的深度
6、RepetitionLevel: 当前字段是否可以重复
7、Footer:主要当前文件的元数据和一些统计信息

三、Parquet的表配置属性
  • parquet. block size:默认值为134217728byte,即128MB,表示 Row Group在内存中的块大小。该值设置得大,可以提升 Parquet文件的读取效率,但是相应在写的时候需要耗费更多的内存
  • parquet. page:size:默认值为1048576byt,即1MB,表示每个页(page)的大小。这个特指压缩后的页大小,在读取时会先将页的数据进行解压。页是 Parquet操作数据的最小单位,每次读取时必须读完一整页的数据才能访问数据。这个值如果设置得过小,会导致压缩时出现性能问题
  • parquet. compression:默认值为 UNCOMPRESSED,表示页的压缩方式。「可以使用的压缩方式有 UNCOMPRESSED、 SNAPPY、GZP和LZO」。
  • Parquet enable. dictionary:默认为tue,表示是否启用字典编码。
  • parquet. dictionary page.size:默认值为1048576byte,即1MB。在使用字典编码时,会在 Parquet的每行每列中创建一个字典页。使用字典编码,如果存储的数据页中重复的数据较多,能够起到一个很好的压缩效果,也能减少每个页在内存的占用。
四、压缩方式

1、Parquet格式存储,Lzo压缩

create table stu_par(id int,name string)
stored as parquet
tblproperties ('parquet.compression'='lzo');

2、Parquet格式存储,Snappy压缩

create table stu_par(id int,name string)
stored as parquet
tblproperties ('parquet.compression'='snappy');

在实际生产中,使用Parquet存储,lzo压缩的方式更为常见,这种情况下可以避免由于读取不可分割大文件引发的数据倾斜。 但是,如果数据量并不大(预测不会有超大文件,若干G以上)的情况下,使用ORC存储,snappy压缩的效率还是非常高的。

五、压缩对比

从存储文件的压缩比和查询速度两个角度对比。
压缩比例:ORC > Parquet > textFile
查询速度:查询速度相近

创建hive表,使用parquet格式存储数据
不可以将txt数据直接加载到parquet的表里面,需要创建临时的txt存储格式的表
1、创建测试数据表

CREATE TABLE emp_txt (
empno int,
ename string,
job string,
mgr int,
hiredate DATE,
sal int,
comm int,
deptno int
)
partitioned BY(dt string,hour string)
row format delimited fields terminated by ",";

2、创建表,存储数据格式为parquet

create table log_parquet(id string,line string)row format delimited fields terminated by '\t'stored as parquet ;

3、向表中加载数据

hive (default)> insert into table log_parquet select * from emp_txt ;

Hive的Parquet存储与LZO压缩相关推荐

  1. Hive之配置和使用LZO压缩

    前言 OS:CentOS 7 Hive:2.3.0 Hadoop:2.7.7 MySQL Server:5.7.10 Hive官方手册:LanguageManual LZO 在配置Hive使用lzo压 ...

  2. 大数据培训Hive的数据存储与压缩

    行存储与列存储 当今的数据处理大致可分为两大类,联机事务处理 OLTP(on-line transaction processing)联机分析处理 OLAP(On-Line Analytical Pr ...

  3. pyspark操作hive分区表以及.gz.parquet和part-00000文件压缩问题

    文章目录 pyspark 操作hive表 1> `saveAsTable`写入 2> `insertInto`写入 2.1> 问题说明 2.2> 解决办法 3>`save ...

  4. hive LZO压缩

    hive LZO压缩 本文环境介绍: 软件 版本 备注 centos 6.5 hadoop 2.7.1 2.7.*即可 hive 2.3.6 lzo 2.10 需要独立安装 1 lzo压缩 1.1 l ...

  5. hdp3.1.4 hive 开启lzo压缩

    因为集群本身是不支持lzo压缩的,所以需要我们自行安装配置. 环境: hdp 3.1.4 hadoop-lzo : 0.4.21 lzo :2.10 安装步骤如下: 在源码编译安装之前需要做一些准备工 ...

  6. HDFS和Spark配置LZO压缩,Spark读取LZO创建正常Task数量

    1.说明 为了解决,数据日益增长并且目前使用Snappy压缩导致的Spark读取时会出现OOM,并且处理起来速度过慢的问题,决定使用LZO+Index来解决问题. 线上Hadoop版本3.2.1,Sp ...

  7. Hadoop之使用LZO压缩并支持分片

    1.简介: 安装LZO: lzo并不是Linux系统原生支持,所以需要下载安装软件包,这里至少需要安装3个软件包. lzo, lzop, hadoop-gpl-packaging. 增加索引: gpl ...

  8. hadoop之使用LZO压缩文件并支持分片

    文章目录 1.安装lzo以及生成测试数据 1.1生成未压缩的测试数据 1.2安装lzo相关工具 1.3使用lzop工具压缩测试数据 2.编译hadoop-lzo 2.1 获取hadoop-lzo源码 ...

  9. hadoop3.x支持LZO压缩配置

    前提 在hadoop中使用lzo的压缩算法可以减小数据的大小和数据的磁盘读写时间,不仅如此,lzo是基于block分块的,这样他就允许数据被分解成chunk,并行的被hadoop处理.这样的特点,就可 ...

最新文章

  1. 梯度下降背后的数学原理几何?
  2. 使用gulp进行React任务的构建
  3. c++与java中子类中调用父类成员的方法
  4. python打开指定文件-python打包压缩、读取指定目录下的指定类型文件
  5. SHA256CryptoServiceProvider vs SHA256Managed
  6. 软考-信息系统项目管理师-项目质量管理
  7. Windows下给SourceTree配置外部比较工具BeyondCompare
  8. 道友,来Rstudio里面看动画了
  9. C#实现软件授权,限定MAC运行(软件license管理,简单软件注册机制)
  10. 图灵奖颁给深度学习三巨头,他们曾是一小撮顽固的“蠢货”
  11. 2018年最受欢迎的Python库,你都用过吗?
  12. 3.2生产者和消费者(Producers and Consumers)
  13. recv函数阻塞_socket缓冲区以及阻塞模式详解
  14. spring框架包含的模块
  15. LSI存储论坛:6Gb SAS让DAS焕发新活力?
  16. html视频怎么转换成图片,视频怎么转成gif格式 录制视频转gif图片用什么软件|gif动画录制工具...
  17. Excel重命名工作表:一键修改为指定的表名
  18. Spring Boot源码简析 @EnableTransactionManagement
  19. cleanmymac苹果电脑必备mac系统垃圾清理工具分享
  20. 微信公众号开发(一)服务器及接口的配置

热门文章

  1. 为云主机申请配置免费的域名和证书
  2. 一文搞懂PMO如何推动流程规范的落地及常见问题如何解决?【管理有度4】
  3. Vmware安装MacOS系统
  4. 06-Maven生命周期和单元测试
  5. 20 函数的极值和最大(小)值
  6. Chrome浏览器——开发者工具截屏干货
  7. 自动驾驶决策——决策基本概念
  8. webstorm配置和使用
  9. 手把手教你通过端口映射,轻松搭建Windows远程桌面
  10. 我的2021秋招 | 互联网、银行、选调 经验分享