Apache ORC 正在参加 2020 年度 OSC 中国开源项目评选,请投票支持!
Apache ORC 在 2020 年度 OSC 中国开源项目评选 中已获得 {{ projectVoteCount }} 票,请投票支持!
投票让它出道
已投票
Apache ORC 获得 2020 年度 OSC 中国开源项目评选「最佳人气项目」 !
Apache ORC 获得 2020 年度 OSC 中国开源项目评选「最佳人气项目」「最积极运营项目」 !
Apache ORC 获得 2020 年度 OSC 中国开源项目评选「最积极运营项目」 !
授权协议 Apache
开发语言 C/C++ 查看源码 »
操作系统 Linux
软件类型 开源软件
所属分类 服务器软件存储系统
开源组织 Apache
地区 不详
投 递 者 红薯
适用人群 未知
收录时间 2017-01-17

软件简介

Apache ORC 文件格式是一种Hadoop生态圈中的列式存储格式,它的产生早在2013年初,最初产生自Apache Hive,用于降低Hadoop数据存储空间和加速Hive查询速度。

ORC(OptimizedRC File)存储源自于RC(RecordColumnar File)这种存储格式,RC是一种列式存储引擎,对schema演化(修改schema需要重新生成数据)支持较差,而ORC是对RC改进,但它仍对schema演化支持较差,主要是在压缩编码,查询性能方面做了优化。RC/ORC最初是在Hive中得到使用,最后发展势头不错,独立成一个单独的项目。Hive 1.x版本对事务和update操作的支持,便是基于ORC实现的(其他存储格式暂不支持)。ORC发展到今天,已经具备一些非常高级的feature,比如支持update操作,支持ACID,支持struct,array复杂类型。你可以使用复杂类型构建一个类似于parquet的嵌套式数据架构,但当层数非常多时,写起来非常麻烦和复杂,而parquet提供的schema表达方式更容易表示出多级嵌套的数据类型。

ORC原生是不支持嵌套数据格式的,而是通过对复杂数据类型特殊处理的方式实现嵌套格式的支持,例如对于如下的hive表:

CREATE TABLE `orcStructTable`(
  `name` string,
  `course` struct<course:string,score:int>,
  `score` map<string,int>,
  `work_locations` array<string>)

ORC格式会将其转换成如下的树状结构(ORC的schema结构):

ORC的schema结构

在ORC的结构中这个schema包含10个column,其中包含了复杂类型列和原始类型的列,前者包括LIST、STRUCT、MAP和UNION类型,后者包括BOOLEAN、整数、浮点数、字符串类型等,其中STRUCT的孩子节点包括它的成员变量,可能有多个孩子节点,MAP有两个孩子节点,分别为key和value,LIST包含一个孩子节点,类型为该LIST的成员类型,UNION一般不怎么用得到。每一个Schema树的根节点为一个Struct类型,所有的column按照树的中序遍历顺序编号。

ORC只需要存储schema树中叶子节点的值,而中间的非叶子节点只是做一层代理,它们只需要负责孩子节点值得读取,只有真正的叶子节点才会读取数据,然后交由父节点封装成对应的数据结构返回。

文件结构

ORC 文件是以二进制方式存储的,所以是不可以直接读取,ORC文件也是自解析的,它包含许多的元数据,这些元数据都是同构ProtoBuffer进行序列化的。ORC的文件结构入图6,其中涉及到如下的概念:

  • ORC文件:保存在文件系统上的普通二进制文件,一个ORC文件中可以包含多个stripe,每一个stripe包含多条记录,这些记录按照列进行独立存储,对应到Parquet中的row group的概念。

  • 文件级元数据:包括文件的描述信息PostScript、文件meta信息(包括整个文件的统计信息)、所有stripe的信息和文件schema信息。

  • stripe:一组行形成一个stripe,每次读取文件是以行组为单位的,一般为HDFS的块大小,保存了每一列的索引和数据。

  • stripe元数据:保存stripe的位置、每一个列的在该stripe的统计信息以及所有的stream类型和位置。

  • row group:索引的最小单位,一个stripe中包含多个row group,默认为10000个值组成。

  • stream:一个stream表示文件中一段有效的数据,包括索引和数据两类。索引stream保存每一个row group的位置和统计信息,数据stream包括多种类型的数据,具体需要哪几种是由该列类型和编码方式决定。

ORC文件结构


ORC文件结构

在ORC文件中保存了三个层级的统计信息,分别为文件级别、stripe级别和row group级别的,他们都可以用来根据Search ARGuments(谓词下推条件)判断是否可以跳过某些数据,在统计信息中都包含成员数和是否有null值,并且对于不同类型的数据设置一些特定的统计信息。

更详细的介绍请看 http://blog.csdn.net/yu616568/article/details/51868447

展开阅读全文

代码

的 Gitee 指数为
超过 的项目

评论 (0)

加载中
更多评论
暂无内容
发表了博客
2013/08/14 09:42

ORC技术

东西都不是自己的..只贴链接.. 引用包为: tesseract-ocr 这玩意是开源的.在3.0之后支持中文. 英文的解析率比较高.至于多少大家可以good查下. 对中文的解析率,就有点力不从心了.解析率不高. 但是至少能用.估计可字体颜色大小.图片清晰度神马的都有关系. 第一篇: http://blog.csdn.net/zhoushuyan/article/details/5948289 这是在java上实现. 第二篇: http://www.cnblogs.com/hangxin1940/archive/2012/01/13/2321507.html 这是怎...

0
1
发表了博客
2019/03/01 19:02

Hive ORC + SNAPPY

Hive orc 格式 + snappy 压缩是比较常用的存储加压缩格式。 今天处理下面的场景时,解决了一些问题,记录下来: flume消费kafka的数据实时写入hdfs,通过创建分区表,t + 1 时,需要看到昨天的数据:    flume 通过snappy 将数据写入hdfs,可以通过在fliume.conf中配置以下 保证每天的数据写入同一个目录中: agent.sinks.hdfs_sink.hdfs.path = /user/hive/warehouse/ods.db/kafka_2_hdfs_test/ods_sale_alter/dt=%Y-%m-%d ...

0
0
发表了博客
2018/09/05 11:11

ORC 文件存储格式

1、orc列式存储概念 a)列式存储:orc并不是纯粹的列式存储,也是先基于行对数据表进行分组(行组),然后对行组进行列式存储。 b)查询数据的时候不需要扫描全部数据(磁盘IO),只需查询指定列即可。 c)orc对每一列提供了常规统计信息(min 、 max 、 sum等),加速查询。例如过滤条件f>10,如果当前分片的max小于10,则直接过滤掉这个分片。 d)每一列的数据都是同构的,因此压缩效率更高。 e)读写orc文件需要压缩、解压,...

0
0
发表了博客
2019/09/24 16:41

Lipo移除ORC架构

Lipo移除ORC架构 打包前检查链接 https://cloud.baidu.com/doc/OCR/OCR-iOS-SDK.html#FAQ cd /Users/guojun/JG-iOS/Product/LH_QJ/LH_QJ/ClassPatch/Tools/ThirdLib/BaiduAI/lib/AipBase.framework lipo -info AipBase Architectures in the fat file: AipBase are: i386 x86_64 armv7 arm64 lipo -remove x86_64 AipBase -o AipBase lipo -remove i386 AipBase -o AipBase cd /Users/guojun/JG-iOS/Product/LH_QJ/LH_QJ/ClassP...

0
0
2020/01/14 23:55

ORC 在 Hive 中的应用

点击蓝色“大数据每日哔哔”关注我 加个“星标”,第一时间获取大数据架构,实战经验 本文主要介绍 ORC 格式在 Hive 中的应用。这里先简单的介绍一下 ORC 格式的优势以及应用。后续会专门写一篇深入ORC格式的文章。 ORC文件不仅仅是一种列式文件存储格式,最重要的是有着很高的压缩比,并且对于MapReduce来说是可切分(Split)的。因此,在Hive中使用ORC作为表的文件存储格式,不仅可以很大程度的节省HDFS存储资源,而且对数据的...

0
0
没有更多内容
加载失败,请刷新页面
点击加载更多
加载中
下一页
暂无内容
0 评论
4 收藏
分享
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部