热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Hive文件格式与压缩

Hive文件格式与压缩Hive支持的存储数据格式主要有:文本格式(TEXTFILE)、二进制序列化文件(SEQUENCEF

Hive文件格式与压缩

Hive支持的存储数据格式主要有:文本格式(TEXTFILE )、二进制序列化文件(SEQUENCEFILE)、行列式文件(RCFile)、优化的行列式文件(ORC)、PARQUET。其中优化的行列式文件(ORC)、PARQUET以其高效的数据存储和数据处理性能得以在实际的生产环境中大量运用。


注: TEXTFILESEQUENCEFILE的存储格式都是基于行式存储的;ORCPARQUET是基于列式存储的。



1.前置准备


实验环境


1)Oracle Linux 7.4

2)Java1.8.0_144

3)Hadoop2.7.4

4)Hive2.3.3

在这里插入图片描述


数据准备


查看股票交易信息的实验数据文件big_stocks.csv内容,共计207万5347行,数据以逗号“,”分隔,依次记录股票交易所编码、股票代码、股票交易日期、股票开盘价、股票开盘价、股票最低价、股票收盘价、股票交易量和股票成交价
在这里插入图片描述


2.实验流程


2.1 创建表stocks_txt

默认格式,数据不做压缩,磁盘开销大,数据解析开销大。可结合Gzip、Bzip2使用,但使用Gzip这种方式,hive不会对数据进行切分,从而无法对数据进行并行操作。


创建表,存储数据格式为TEXTFILE


create table stocks_txt(exchanger string,symbol string,ymd string,price_open float,price_high float,proce_low float,price_close float,volume int,price_adj_close float
) ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
STORED AS textfile;

在这里插入图片描述


加载big_stocks.csv文件内容至表stocks_txt


LOAD DATA LOCAL INPATH '/root/experiment/datas/hive/big_stocks.csv' OVERWRITE INTO TABLE stocks_txt;

在这里插入图片描述


查看数据文件为.csv文本格式


命令端查看

dfs -lsr /data/hive/warehouse/stocks_txt;

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XCu4seIf-1650764585158)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20220424085920900.png)]

Web端查看

在这里插入图片描述


2.2 创建表stocks_orc

Orc (Optimized Row Columnar)是Hive 0.11版引入的新的存储格式。ORC存储的文件是一种带有模式描述的行列式存储文件,有别于传统的数据存储文件,它会将数据先按照行组进行切分,一个行组内部包含若干行,每一行再按列进行存储。例如:每个Orc文件由1个或多个stripe组成,每个stripe250MB大小,这个Stripe实际相当于RowGroup概念。


ORC文件结构由三部分组成:


条带(Stripe):ORC文件存储数据的地方。
文件脚注(File Footer):包含文件中stripe的列表,每个stripe的行数,以及每个列的数据类型。它还包含了每个列的最小值、最大值、行计数、求和等聚合信息。
Postscript:记录整个文件的压缩类型,含有压缩参数和压缩大小相关的信息。


Stripe结构也可以分为三个部分:


Index Data:它保存了所在条带的一些统计信息,以及数据在stripe中的位置索引信息。它是一个轻量级的索引,默认是每隔1W行做一个索引。这里做的索引应该只是记录某行的各字段在Row Data中的offset。
Row Data:存的是具体的数据,先取部分行,然后对这些行按列进行存储。对每个列进行了编码,分成多个Stream来存储。
Stripe Footer:存的是各个Stream的类型,长度等信息。
Row Data主要存储两部分的数据,即metadata stream和data stream:
metadata stream:用于描述每个行组的元数据信息;
data stream:存储数据的地方;


从上面的ORC文件结构可知ORC在每个文件中提供了3个级别的索引:


文件级:这一级的索引信息记录文件中所有stripe的位置信息,以及文件中所存储的每列数据的统计信息。 File Footer
条带级:该级别索引记录每个strpe所存储数据的统计信息。 Index Data
行组级:在stripe中,每隔10000行构成一个行组,该级别的索引信息就是记录这个行组中存储的数据的统计信息。 metadata stream
程序在查询ORC文件类型的表时,会先读取每一列的索引信息,将查找数据的条件和索引信息进行比较,找到满足查找条件的文件。接着根据文件中的索引信息,找到存储对应的查询条件数据stripe,再借助stripe的索引信息读取文件中满足查询条件的所有行组。之后再根据stripe中每个行组的索引信息和查询条件比对的结果,找到满足要求的列。

create table stocks_orc(exchanger string,symbol string,ymd string,price_open float,price_high float,proce_low float,price_close float,volume int,price_adj_close float
) ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
STORED AS orc;

在这里插入图片描述


加载big_stocks.csv文件内容至表stocks_orc中


INSERT INTO stocks_orc SELECT * FROM stocks_txt;

在这里插入图片描述


2.3 创建表stocks_parquet

Parquet是面向分析型业务的列式存储格式,由Twitter和Cloudera合作开发,2015年5月从Apache的孵化器里毕业成为Apache顶级项目。

在一个Parquet类型的Hive表文件中,数据被分成多个行组(Row Group),一个行组包含这个行组对应的区间内的所有列的列块(column chunk)。一个列块负责存储某一列的数据,一个列块由page组成,page是压缩和编码的单元。Row Group是数据读写时的缓存单元。

Parquet文件是以二进制方式存储的,所以是不可以直接读取的,文件中包括该文件的数据和元数据,因此Parquet格式文件是自解析的。

通常情况下,在存储Parquet数据的时候会按照Block大小设置行组的大小,由于一般情况下每一个Mapper任务处理数据的最小单位是一个Block,这样可以把每一个行组由一个Mapper任务处理,增大任务执行并行度。


在Parquet中,有三种类型的页:数据页、字典页和索引页


数据页用于存储当前行组中该列的值,字典页存储该列值的编码字典,每一个列块中最多包含一个字典页,索引页用来存储当前行组下该列的索引,目前Parquet中还不支持索引页。


创建存储数据格式为parquet的表stocks_parquet


create table stocks_parquet(exchanger string,symbol string,ymd string,price_open float,price_high float,proce_low float,price_close float,volume int,price_adj_close float
) ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
STORED AS parquet;

加载big_stocks.csv文件内容至表parquet_stocks中


INSERT INTO stocks_parquet SELECT * FROM stocks_txt;

在这里插入图片描述


2.4 创建表stocks_sequence


设置块压缩格式


SET io.seqfile.compression.type=BLOCK;

创建存储数据格式为parquet的表stocks_sequence


create table stocks_sequence(exchanger string,symbol string,ymd string,price_open float,price_high float,proce_low float,price_close float,volume int,price_adj_close float
) ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
STORED AS sequencefile;

加载big_stocks.csv文件内容至表parquet_stocks中


INSERT INTO stocks_sequence SELECT * FROM stocks_txt;

在这里插入图片描述


2.5 存储数据格式查询比较


文本格式存储表的统计查询


SELECT count(*) FROM stocks_txt;

在这里插入图片描述


orc存储表的统计查询


在这里插入图片描述


parquet格式存储表的统计查询


在这里插入图片描述


sequence格式存储表的统计查询


SELECT count(*) FROM stocks_sequence;

在这里插入图片描述


3. 实验总结


存储文件的压缩比:

ORC > Sequence >Parquet > textFile

综上所述,涉及到的4个查询经比较可知,在进行文本格式存储表查询时会调用MR任务,在实训开发中,我们应尽可能避免调用MR程序,降低时间成本消耗。


申明:文章仅做记录,涉及侵权内容请联系删除


推荐阅读
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 本文介绍了如何使用PHP向系统日历中添加事件的方法,通过使用PHP技术可以实现自动添加事件的功能,从而实现全局通知系统和迅速记录工具的自动化。同时还提到了系统exchange自带的日历具有同步感的特点,以及使用web技术实现自动添加事件的优势。 ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • 本文介绍了机器学习手册中关于日期和时区操作的重要性以及其在实际应用中的作用。文章以一个故事为背景,描述了学童们面对老先生的教导时的反应,以及上官如在这个过程中的表现。同时,文章也提到了顾慎为对上官如的恨意以及他们之间的矛盾源于早年的结局。最后,文章强调了日期和时区操作在机器学习中的重要性,并指出了其在实际应用中的作用和意义。 ... [详细]
  • Python SQLAlchemy库的使用方法详解
    本文详细介绍了Python中使用SQLAlchemy库的方法。首先对SQLAlchemy进行了简介,包括其定义、适用的数据库类型等。然后讨论了SQLAlchemy提供的两种主要使用模式,即SQL表达式语言和ORM。针对不同的需求,给出了选择哪种模式的建议。最后,介绍了连接数据库的方法,包括创建SQLAlchemy引擎和执行SQL语句的接口。 ... [详细]
  • WhenIusepythontoapplythepymysqlmoduletoaddafieldtoatableinthemysqldatabase,itdo ... [详细]
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • Python爬虫中使用正则表达式的方法和注意事项
    本文介绍了在Python爬虫中使用正则表达式的方法和注意事项。首先解释了爬虫的四个主要步骤,并强调了正则表达式在数据处理中的重要性。然后详细介绍了正则表达式的概念和用法,包括检索、替换和过滤文本的功能。同时提到了re模块是Python内置的用于处理正则表达式的模块,并给出了使用正则表达式时需要注意的特殊字符转义和原始字符串的用法。通过本文的学习,读者可以掌握在Python爬虫中使用正则表达式的技巧和方法。 ... [详细]
  • 【shell】网络处理:判断IP是否在网段、两个ip是否同网段、IP地址范围、网段包含关系
    本文介绍了使用shell脚本判断IP是否在同一网段、判断IP地址是否在某个范围内、计算IP地址范围、判断网段之间的包含关系的方法和原理。通过对IP和掩码进行与计算,可以判断两个IP是否在同一网段。同时,还提供了一段用于验证IP地址的正则表达式和判断特殊IP地址的方法。 ... [详细]
  • 本文讨论了编写可保护的代码的重要性,包括提高代码的可读性、可调试性和直观性。同时介绍了优化代码的方法,如代码格式化、解释函数和提炼函数等。还提到了一些常见的坏代码味道,如不规范的命名、重复代码、过长的函数和参数列表等。最后,介绍了如何处理数据泥团和进行函数重构,以提高代码质量和可维护性。 ... [详细]
  • 本文介绍了Oracle存储过程的基本语法和写法示例,同时还介绍了已命名的系统异常的产生原因。 ... [详细]
  • 本文讨论了在VMWARE5.1的虚拟服务器Windows Server 2008R2上安装oracle 10g客户端时出现的问题,并提供了解决方法。错误日志显示了异常访问违例,通过分析日志中的问题帧,找到了解决问题的线索。文章详细介绍了解决方法,帮助读者顺利安装oracle 10g客户端。 ... [详细]
author-avatar
sl51866
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有