Hive常见文件存储格式

  • 背景:列式存储和行式存储

    首先来看一下一张表的存储格式:

    字段A 字段B 字段C
    A1 B1 C1
    A2 B2 C2
    A3 B3 C3
    A4 B4 C4
    A5 B5 C5

行式存储

A1B1C1 A2B2C2 A3B3C3 A4B4C4 A5B5C5

列式存储

A1A2A3A4A5 B1B2B3B4B5 C1C2C3C4C5

优缺点比较:

行式存储

优点:

  • 相关的数据是保存在一起,比较符合面向对象的思维,因为一行数据就是一条记录

  • 这种存储格式比较方便进行INSERT/UPDATE操作

缺点:

    • 如果查询只涉及某几个列,它会把整行数据都读取出来,不能跳过不必要的列读取。当然数据比较少,一般没啥问题,如果数据量比较大就比较影响性能

    • 由于每一行中,列的数据类型不一致,导致不容易获得一个极高的压缩比,也就是空间利用率不高

    • 不是所有的列都适合作为索引

列式存储

优点:

  • 查询时,只有涉及到的列才会被查询,不会把所有列都查询出来,即可以跳过不必要的列查询

  • 高效的压缩率,不仅节省储存空间也节省计算内存和CPU

    • 任何列都可以作为索引

    缺点:

    • INSERT/UPDATE很麻烦或者不方便

    • 不适合扫描小量的数据

 

hive文件存储格式包括以下几类:

  • TEXTFILE

  • SEQUENCEFILE

  • RCFIL

  • ORCFILE(0.11以后出现)

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

    SEQUENCEFILE,RCFILE,ORCFILE格式的表不能直接从本地文件导入数据,数据要先导入到textfile格式的表中, 然后再从表中用insert导入SequenceFile,RCFile,ORCFile表中。

首先创建一张source_table表,格式为textfile。

create table source_table(id int,name string, age int) row format delimited fields terminated by ',' stored as textfile;
​
load data local inpath '/root/hivedata/source_table.txt' into table source_table;
1,allen1,18
2,allen2,18
3,allen3,18
4,allen4,18
5,allen5,18
6,allen6,18
7,allen7,18
8,allen8,18
9,allen9,18
10,allen10,18

TEXTFILE

  • Hive数据表的默认格式

存储方式:行存储。

数据不做压缩,磁盘开销大,数据解析开销大。

可结合Gzip、Bzip2使用(系统自动检查,执行查询时自动解压),但使用这种方式,hive不会对数据进行切分,从而无法对数据进行并行操作。

create table if not exists textfile_table(
id int,
name string,
age int)
row format delimited
fields terminated by ','
stored as textfile;
插入数据操作:(map/reduce 输出压缩)
GZip和BZip2压缩格式是hadoop版本支持的,而且linux本地的库也支持这种格式的压缩和解压缩。

SEQUENCEFILE

Hadoop API提供的一种二进制文件,以key-value的形式序列化到文件中。

set hive.exec.compress.output=true;
set mapred.output.compress=true;
set mapred.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec;
set io.compression.codecs=org.apache.hadoop.io.compress.GzipCodec;
​
insert overwrite table textfile_table select * from source_table;

存储方式:行存储。

其具有使用方便、可分割、可压缩的特点。

SequenceFile支持三种压缩选择:NONE,RECORD,BLOCK。Record压缩率低,一般建议使用BLOCK压缩。

压缩数据文件可以节省磁盘空间,但Hadoop中有些原生压缩文件的缺点之一就是不支持分割。支持分割的文件可以并行的有多个mapper程序处理大数据文件,大多数文件不支持可分割是因为这些文件只能从头开始读。Sequence File是可分割的文件格式,支持Hadoop的block级压缩。

create table if not exists seqfile_table(
id int,
name string,
age int)
row format delimited
fields terminated by ','
stored as sequencefile;
插入数据操作:
set hive.exec.compress.output=true;
set mapred.output.compress=true;
set mapred.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec;
set io.compression.codecs=org.apache.hadoop.io.compress.GzipCodec;
SET mapred.output.compression.type=BLOCK;
insert overwrite table seqfile_table select * from source_table;

RCFILERCFILE是一种行列存储相结合的存储方式。首先,其将数据按行分块,保证同一个record在一个块上,避免读一个记录需要读取多个block。其次,块数据列式存储,有利于数据压缩和快速的列存取。

create table if not exists rcfile_table(
id int,
name string,
age int)
row format delimited
fields terminated by ','
stored as rcfile;
插入数据操作:
set hive.exec.compress.output=true;
set mapred.output.compress=true;
set mapred.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec;
set io.compression.codecs=org.apache.hadoop.io.compress.GzipCodec;
​
insert overwrite table rcfile_table select * from source_table;

相比TEXTFILE和SEQUENCEFILE,RCFILE由于列式存储方式,数据加载时性能消耗较大,但是具有较好的压缩比和查询响应。数据仓库的特点是一次写入、多次读取,因此,整体来看,RCFILE相比其余两种格式具有较明显的优势。

  • ORCFile存储格式

    就是OptimizedRC File的缩写。意指优化的RCFile存储格式。

    hive/spark都支持这种存储格式,它存储的方式是采用数据按照行分块,每个块按照列存储,其中每个块都存储有一个索引。特点是数据压缩率非常高。

hive常见的存储格式的更多相关文章

  1. 第3节 hive高级用法:15、hive的数据存储格式介绍

    hive当中的数据存储格式: 行式存储:textFile sequenceFile 都是行式存储 列式存储:orc parquet 可以使我们的数据压缩的更小,压缩的更快 数据查询的时候尽量不要用se ...

  2. hive的数据存储格式

    hive的数据存储格式 Hive支持的存储数的格式主要有:TEXTFILE(行式存储) .SEQUENCEFILE(行式存储).ORC(列式存储).PARQUET(列式存储). 1 列式存储和行式存储 ...

  3. hive表的存储格式; ORC格式的使用

    hive表的源文件存储格式有几类: 1.TEXTFILE 默认格式,建表时不指定默认为这个格式,导入数据时会直接把数据文件拷贝到hdfs上不进行处理.源文件可以直接通过hadoop fs -cat 查 ...

  4. 大数据:Hive - ORC 文件存储格式

    一.ORC File文件结构 ORC的全称是(Optimized Row Columnar),ORC文件格式是一种Hadoop生态圈中的列式存储格式,它的产生早在2013年初,最初产生自Apache ...

  5. Hive - ORC 文件存储格式【转】

    一.ORC File文件结构 ORC的全称是(Optimized Row Columnar),ORC文件格式是一种Hadoop生态圈中的列式存储格式,它的产生早在2013年初,最初产生自Apache ...

  6. Hive文件的存储格式

    hive文件存储格式包括以下几类: TEXTFILE SEQUENCEFILE RCFILE 自定义格式 其中TEXTFILE为默认格式,建表时不指定默认为这个格式,导入数据时会直接把数据文件拷贝到h ...

  7. Hive(10)-文件存储格式

    Hive支持的存储数据的格式主要有:TEXTFILE .SEQUENCEFILE.ORC.PARQUET 一. 列式存储和行式存储 左边为逻辑表,右边第一个为行式存储,第二个为列式存储 1. 行式存储 ...

  8. hive常见的几种优化手段

    Hive调优的几个入手点: Hive是基于Hadoop框架的,Hadoop框架又是运行在JVM中的,而JVM最终是要运行在操作系统之上的,所以,Hive的调优可以通过如下几个方面入手: 操作系统调优 ...

  9. hive中parquet存储格式数据类型timestamp的问题

    当存储格式为parquet 且 字段类型为 timestamp 且 数据用hive执行sql写入. 这样的字段在使用impala读取时会少8小时.建议存储为sequence格式或者将字段类型设置为st ...

随机推荐

  1. laravel将数组转换成集合

    $myArray = collect($this -> menuPermissionTypes); //$this -> menuPermissionTypes是数组! dd($myArr ...

  2. MapFields和并行计算(OpenFOAM)

    这几天研究了一下OpenFOAM里的MapFields和并行计算,总结一下. Case 1 先进行并行计算 SetFields 初始化流场 decomposePar 把初始化好的流场分块 mpirun ...

  3. Angular.js分页代码

                $scope.reloadList=function(){                             $scope.findPage( $scope.pagina ...

  4. 批量新增数据(BuckCopy)

    批量新增数据(BuckCopy) 使用webService传输数据时要注意,Datatable中的数据类型,以及科学计数 /// <summary> /// 批量新增数据 /// < ...

  5. go routine

    无缓冲 channel 是在多个 goroutine 之间同步很棒的工具. 当在 Go 中用 ch := make ( chan bool ) 创建 chennel 时,bool 型的 无缓冲 cha ...

  6. 删除maven项目后eclipse无法启动

    An internal error occurred during: "reload maven project". java.lang.NullPointerExceptio   ...

  7. html select美化模拟jquery插件select2.js

    代码展示:http://www.51xuediannao.com/demo.php 代码说明: select2.js是一个html select美化模拟类jquery插件,但是select2.js又远 ...

  8. chrony实现局域网时间同步

    chrony基于cs架构实现,配置一台服务主机与其他客户主机即可 服务端 #yum install chrony --RHEL7默认已安装chrony,而没有安装ntpd. #systemctl st ...

  9. postgres日志爆盘处理方案-转自DBA汪x

    背景:我们的服务是一个带有部分批处理业务的服务,在跑历史数据入pg时会有大量日志产出,现场服务器出现过几次爆盘,询问DBA后制定了以下两个方案: 方案一:如果不关心或不会使用pg日志,通过参数控制减少 ...

  10. 反射与类加载之反射基本概念与Class(一)

    更多Android高级架构进阶视频学习请点击:https://space.bilibili.com/474380680本篇文章将从以下几个内容来阐述反射与类加载: [三种获取Class对象的方式] [ ...