当前位置: 首页 > article >正文

Hive的存储格式

文章目录

  • Hive的存储格式
    • 1.存储格式简介
    • 2.行存储与列存储
      • 行式存储
      • 列式存储
      • 混合的 PAX 存储结构
    • TextFile
    • SequenceFile

Hive的存储格式

1.存储格式简介

Hive支持的存储数的格式主要有:TEXTFILE(默认格式) 、SEQUENCEFILE、RCFILE、ORCFILE、PARQUET。

textfile为默认格式,建表时没有指定文件格式,则使用TEXTFILE,导入数据时会直接把数据文件拷贝到hdfs上不进行处理;

sequencefile,rcfile,orcfile格式的表不能直接从本地文件导入数据,数据要先导入到textfile格式的表中,然后再从表中用insert导入sequencefile、 rcfile、orcfile表中。

2.行存储与列存储

行式存储下一张表的数据都是放在一起的,但列式存储下数据被分开保存了。

行式存储

行存储模式就是把一整行存在一起,包含所有的列,这是最常见的模式。这种结构能很好的适应动态的查询。

比如:select a from tableAselect a, b, c, d, e, f, g from tableA这样两个查询其实查询的开销差不多,都需要把所有的行读进来过一遍,拿出需要的列。

而且这种情况下,属于同一行的数据都在同一个 HDFS 块上,重建一行数据的成本比较低。

但是这样做有两个主要的弱点:

  • 当一行中有很多列,而我们只需要其中很少的几列时,我们也不得不把一行中所有的列读进来,然后从中取出一些列。这样大大降低了查询执行的效率。
  • 基于多个列做压缩时,由于不同的列数据类型和取值范围不同,压缩比不会太高。

**优点:**数据被保存在一起,insert和update更加容易

**缺点:**选择(selection)时即使只涉及某几列,所有数据也都会被读取

列式存储

列存储是将每列单独存储或者将某几个列作为列组存在一起。列存储在执行查询时可以避免读取不必要的列。而且一般同列的数据类型一致,取值范围相对多列混合更小,在这种情况下压缩数据能达到比较高的压缩比。

但是这种结构在重建行时比较费劲,尤其当一行的多个列不在一个 HDFS 块上的时候。比如我们从第一个 DataNode 上拿到 column A,从第二个 DataNode 上拿到了 column B,又从第三个 DataNode 上拿到了 column C,当要把 A,B,C 拼成一行时,就需要把这三个列放到一起重建出行,需要比较大的网络开销和运算开销。

**优点:**查询时只有涉及到的列会被读取,效率高

**缺点:**选中的列要重新组装,insert/update比较麻烦

混合的 PAX 存储结构

PAX 结构是将行存储和列存储混合使用的一种结构,主要是传统数据库中提高 CPU 缓存利用率的一种方法,并不能直接用到 HDFS 中。但是 RCFile 和 ORC 是继承自它的思想,先按行存再按列存。

TEXTFILE、SEQUENCEFILE的存储格式是基于行存储的

ORC和PARQUET是基于列式存储的。

TextFile

TextFile 为 Hive 默认格式,建表时不指定则默认为这个格式,导入数据时会直接把数据文件拷贝到 hdfs 上不进行处理。

创建一个 TextFile 格式的 Hive 表:

create table if not exists ldsx_table (    
name STRING,    
age STRING,   
class_t STRING,
tc STRING)
row formated delimated fields terminated by '\t'stored as textfile;  -- 可不指定(默认格式)

向 TextFile 表中加载数据:

load data local inpath "hdfs://xxxxx/xxxx/xxx.csv"  into table textfile_table

TextFile 优缺点

TextFile 格式因为不对导入的数据文件做处理,所以可以直接使用 load 方式加载数据,其他存储格式则不能使用 load 直接导入数据文件。所以 TextFile 的加载速度是最高的

TextFile 格式虽然可以使用 Gzip 压缩算法,但压缩后的文件不支持 split。在反序列化过程中,必须逐个字符判断是不是分隔符和行结束符,因此反序列化开销会比 SequenceFile 高几十倍。

SequenceFile

SequenceFile 是 Hadoop API 提供的一种二进制文件支持,其具有使用方便、可分割、可压缩的特点。

SequenceFIle 的内部格式取决于是否启用压缩,如果是压缩,则又可以分为记录压缩和块压缩。

无压缩(NONE):如果没有启用压缩(默认设置)那么每个记录就由它的记录长度(字节数)、键的长度,键和值组成。长度字段为 4 字节。

记录压缩(RECORD):记录压缩格式与无压缩格式基本相同,不同的是值字节是用定义在头部的编码器来压缩。注意:键是不压缩的。

块压缩(BLOCK):块压缩一次压缩多个记录,因此它比记录压缩更紧凑,而且一般优先选择。当记录的字节数达到最小大小,才会添加到块。该最小值由 io.seqfile.compress.blocksize 中的属性定义。默认值是 1000000 字节。格式为记录数、键长度、键、值长度、值。Record 压缩率低,一般建议使用 BLOCK 压缩。

创建一个 SequenceFile 格式的 Hive 表:

create table if not exists seqfile_table(    ueserid STRING,    movieid STRING,    rating STRING,    ts STRING)row format delimitedfields terminated by '\t'stored as sequencefile;

设置压缩格式为块压缩:

set mapred.output.compression.type=BLOCK;

向 SequenceFile 表中加载数据:

insert overwrite table seqfile_table select * from textfile_table;

复制

SequenceFile 优点

  • 支持基于记录(Record)或块(Block)的数据压缩。
  • 支持 splitable,能够作为 MapReduce 的输入分片。
  • 修改简单:主要负责修改相应的业务逻辑,而不用考虑具体的存储格式。

SequenceFile 的缺点

  • 需要一个合并文件的过程,且合并后的文件不方便查看。

http://www.kler.cn/a/293086.html

相关文章:

  • Iotop使用
  • opencv常用api
  • MFC工控项目实例二十九主对话框调用子对话框设定参数值
  • 在linux中使用nload实时查看网卡流量
  • [代码随想录Day10打卡] 理论基础 232.用栈实现队列 225. 用队列实现栈 20. 有效的括号 1047. 删除字符串中的所有相邻重复项
  • vue中如何关闭eslint检测?
  • 晨控CK-FR08与汇川5U系列PLC配置EtherNet/IP通讯连接手册
  • MySQL的知识阶段小总结
  • k8s服务发布Ingress
  • 【高级编程】万字整理集合框架 迭代器 泛型(含方法案例)
  • 使用 .NET 6 构建跨平台 Worker Service 服务:跨越平台的 C# 服务开发——解决Windows服务跨平台问题
  • typedef关键字讲解
  • List与ArrayList
  • XSS 漏洞 - 学习手册
  • 《响应式 Web 设计:纯 HTML 和 CSS 的实现技巧》
  • Spring Boot集成google Authenticator实现mfa
  • 企业数据治理之主数据--设备主数据
  • 设计模式之装饰器模式:让对象功能扩展更优雅的艺术
  • 基于智能巡检机器人的算力评估指标及其应用场景分析
  • EmguCV学习笔记 VB.Net 9.1 VideoCapture类
  • 如何通过Spring Cloud Consul增强微服务安全性和可靠性
  • C语言调用子函数时入/出栈(保护/恢复现场)全过程分析:以Cortex-M3为例
  • 【免费体验半价使用】ChatGPT的发展历程和重要节点,普通如何使用以及它能给我们带来什么?
  • 深度学习——强化学习算法介绍
  • COD论文笔记 BiRefNet
  • docker拉取redis5.0.5并建立redis集群