正文

带有描述式的行列式存储文件。将数据分组切分,一组包含很多行,每一行再按例进行存储。

orc文件结合了行式和列式存储结构的优点,在有大数据量扫描读取时,可以按行进行数据读取。如果要读取某列的数据,可以在读取行组的基础上读取指定的列,而不需要读取行组内所有数据以及一行内的所有字段数据。

1.1 orc文件的结构:

Hive parquet 大文件拆分 hive读取parquet文件_Hive parquet 大文件拆分


Hive parquet 大文件拆分 hive读取parquet文件_学习_02

条带(stripe)

orc文件存储数据的地方

文本脚注(file footer)

包含了stripe列表,每个stripe包含的行数,以及每个列的数据类型。包含每个列的最大值,最小值,行计数,求 和等信息。

postscript

压缩参数和压缩大小相关的信息

1.2 stripe结构

分为三部分:index data、rows data、stripe footer

index data:保存了所在条带的一些统计信息,以及数据在stripe中的位置索引信息

rows data:存储数据的地方,由多行组成,数据以stream(流)的形式存储

stripe footer:保存数据所在的目录

1.3 rows data数据结构

metadata stream :描述每个行组的元数据信息

data stream:存储数据的地方

1.4 orc文件中提供了三个级别的索引

文件级别:记录文件中所有script的位置信息,以及文件中存储的每列数据的统计信息

条带级别:记录每个stripe所存储的数据统计信息

行组级别:在script中,每10000行构成一个行组,该级别的索引信息就是记录这个行组中存储的数据统计信息

1.5 效率和数据类型

通过orc文件的索引,可以快速定位要查询的数据块,规避不满足查询条件的数据块和文件,相比读取传统的数据文件,进行查找时需要遍历全部数据,使用orc可以避免磁盘和网络的I/O浪费,从而提高查询效率。提升整个集群的工作负载。

hive以orc文件格式存储时,描述这些数据的字段信息,字段类型信息以及编码等信息都和orc中存储的数据放在一起。

orc文件都是自描述的,不依赖外部的数据,也不存储在hive元数据库中。

数据类型:boolean,tinyint、smallint、int、bigint、float、double、string、varchar、char、binary,timestamp和date、

复杂类型:struct、list、map、union

所有类型都可以接受null值。

1.6 acid事务的支持

0.14版本之前,hive表的数据只能新增或者整块删除分区表,而不能对表进行单个记录的修改。0.14版本以后,orc文件类型能够确保hive在工作时的原子性、一致性、隔离性、持久性的ACID事务能够被正确的使用。可以对单条数据进行更新。

hive 的事务适合对大批量的数据进行更新,不适合频繁的小批量数据。
下面是创建hive事务表的方法

--(1)开启配置
----开启并发支持,支持删除和更新事务

set hive.support.concurrentcy=true;

----支持acid事务的表必须为分桶表

set hive.enforce.bucketing=true;

-----动态分区,开启事务需要开启动态分区非严格模式

set hive.exec.dynamic.partition=true;

set hive.exec.dynamic.partition.mode=nonstrict;

----所有的org.apache.hadoop.hive.sql.lockmgr.DummyTxnManager 不支持事务

set hive.txn.manager=org.apache.hadoop.hive.sql.lockmgr.DummyTxnManager

---开启在相同的一个meatore实例运行初始化和清理的线程

set hive.compactor.initiator.on=true;

--设置每个metastore实例运行的线程数

set hive.compactor.worker.threads=1

--(2)创建表
-- 必须支持分桶
create table student_txn
( id int,
  name String
)cluster by (id) into 2 buckets
stored as orc
-- 表属性中添加支持事务
tblproperties('transactional' = 'true')

--(3) 插入数据,更新数据

insert into table student_txn values('1000','student\_1001');

update student_txn set name='student\_lzn' where id='1001';
1.7 orc相关的配置

orc.compress: 压缩类型,none,zlib,snappy

orc.compress.size: 压缩块的大小,默认值262114(256kb)

orc.stripe.size: 写stripe,可以使用的内存缓冲池大小,默认67108864(64mb)

orc.row.index.stride: 行组级别的索引数量大小,默认10000,必须设定为大于10000的数。

orc.create.index: 是否创还能行组级别索引,默认true

orc.bloom.filter.columns: 需要创建的布隆过滤器的组

orc.bloom.filter.fpp: 使用布隆过滤器的假正(false positive)概率,默认为0.05

hive中使用布隆过滤器可以用较少的空间判定数据是否存在表中(如果不存在,那么100%就是不存在,存在的话再去查找确认存在)。

hive表配置属性:

hive.stats.gather.num.threads: 收集统计信息的线程数,默认10。只适用于orc这类已经实现StatsProvidingReader接口的文件格式。

hive.exec.core.memory.pool: 写orc文件,可以使用的已分配堆内存的最大比例。

hive.exec.orc.default.stripe.size: 每个stripe文件,可以会用的缓冲池大小,默认64MB。

hive.exec.orc.default.block.size: 每个stripe存储文件块大小,默认256MB。