Hive-ORC文件存储格式(续)
本文在Hive-ORC文件存储格式的理论基础上,进一步分析一个实际的Hive ORC表中的数据存储形式。
一、表结构
库名+表名:fileformat.test_orc
| 字段 | 类型 |
|---|---|
| category_id | string |
| product_id | int |
| brand_id | int |
| price | double |
| category_id_2 | string |
在hive中命令desc formatted fileformat.test_orc;的结果如下图:
根据上图中的location信息,查看在HDFS上的文件:
二、查看dump文件
hive提供了一个--orcfiledump参数用于查看HDFS上ORC表格的文件信息,在hive-0.13版本中的使用方法为:hive --orcfiledump <location-of-orc-file>,其他版本的使用方法可以去官方文档中查找。
下面是命令hive --orcfiledump /user/hive/warehouse/fileformat.db/test_orc/000000_0的查询结果
三、dump文件分析
接下来的分析,请对照着文章Hive-ORC文件存储格式中的图1-ORC文件结构图进行。
使用hql语句,统计出各字段的count, min, max, sum信息如下:
| 字段 | COUNT | MIN | MAX | SUM |
|---|---|---|---|---|
| category_id | 1000000 | 5011 | 975673 | 4.0222868968E11 |
| product_id | 1000000 | 968 | 50997770 | 27158964508399 |
| brand_id | 999130 | 0 | 1026427 | 774991825568 |
| price | 1000000 | -0.0092 | 358000.0 | 1.8953626711045265E8 |
| category_id_2 | 1000000 | 5010 | 5996 | 5.183530839E9 |
从dump文件的图片中可以看出,大致分成四个部分:
1、表结构信息
记录整张表的记录数,压缩方式,压缩大小,以及表结构。在表结构部分,ORC将整张表的所有字段构造成一个大的struct结构。对应图1-ORC文件结构图中的Postscript部分。
2、Stripe统计信息
统计当前HDFS文件对应Stripe的信息,包括各个字段的count,min, max, sum信息。对于最外层的Struct,只统计其count值。由于这张表数据量不大,当前HDFS文件中只有一个Stripe。对应图1-ORC文件结构图中的Stripe Footer部分。
3、File统计信息
统计内容和第二部分一致,不过这里统计的整张表的每个字段count, min, max, sum信息。对应图1-ORC文件结构图中的FileFooter部分。
这里我们将dump文件中的统计信息,与各字段实际统计信息作对比。通过与上面表格中各字段统计信息对比,发现对于int类型和double类型的字段,min, max, sum的结果都是匹配的。但是对于string类型的字段,仅仅只有min, max统计结果一致,sum的结果不相同。
4、Stripe详细信息
统计各Stripe的offset,总记录行数等Stripe层次的信息。该Stripe中各字段的Index Data和Row Data,以及每个字段的编码方式。
前面一行Stripe: offset: 3 data: 7847351 rows: 1000000 tail: 132 index: 7936应该也是保存在FileFooter中,后面各个字段统计信息对应图1-ORC文件结构图中的Index Data和Row Data部分。
从dump文件中的数据可以看出,每个字段的ROW_INDEX以及DATA信息是保存在一块连续空间中的,这块文件从offset=3开始。这也说明图1-ORC文件结构图中Row Data区的数据紧随Index Data区数据之后。
Index Data数据统计:
| 起始位置 | 字段 |
|---|---|
| 3……21 | STRUCT |
| 22……1141 | category_id |
| 1142……3056 | product_id |
| 3057……5135 | brand_id |
| 5136……7201 | price |
| 7202……7938 | category_id_2 |
Row Data数据统计:
| 起始位置 | 字段 | 描述 |
|---|---|---|
| 7939……59887 | category_id | 字段对应词条int流 |
| 59888……59898 | category_id | 词条长度int流 |
| 59899……60989 | category_id | 字典词条数据 |
| 60990……3525432 | product_id | 实际数据int流 |
| 3525433……3527085 | brand_id | 标识IF NULL的byte流 |
| 3527086……5708142 | brand_id | 实际数据int流 |
| 5708143……7855016 | price | double类型 |
| 7855017……7855212 | category_id_2 | 字段对应词条int流 |
| 7855213……7855219 | category_id_2 | 词条长度int流 |
| 7855220……7855289 | category_id_2 | 字典词条数据 |
在ORC文件的int类型和string类型保存时,会有一个byte流用于记录字段的某个记录是否为null,根据统计只有brand_id 字段的count值不足100000条,也就是说除了brand_id 字段之外,其他字段中没有null值。所以在上面Row Data表中,只有brand_id有一个对应的IF NULL标识流。一个String类型,会将词条数据保存在字节流中,然后一个int流记录每个词条的长度,另外一个int流用于指定字段某个记录对应字典词条中的哪一个。
这部分最后记录了每一个字段的存储方式,统计如下
| 字段 | 类型 | 存储方式 |
|---|---|---|
| STRUCT | DIRECT | |
| category_id | String | DICTIONARY_V2 |
| product_id | Int | DIRECT_V2 |
| brand_id | Int | DIRECT_V2 |
| price | Double | DIRECT |
| category_id_2 | String | DICTIONARY_V2 |
Hive-ORC文件存储格式(续)的更多相关文章
- 大数据:Hive - ORC 文件存储格式
一.ORC File文件结构 ORC的全称是(Optimized Row Columnar),ORC文件格式是一种Hadoop生态圈中的列式存储格式,它的产生早在2013年初,最初产生自Apache ...
- Hive - ORC 文件存储格式【转】
一.ORC File文件结构 ORC的全称是(Optimized Row Columnar),ORC文件格式是一种Hadoop生态圈中的列式存储格式,它的产生早在2013年初,最初产生自Apache ...
- ORC 文件存储格式
1.orc列式存储概念 a)列式存储:orc并不是纯粹的列式存储,也是先基于行对数据表进行分组(行组),然后对行组进行列式存储. b)查询数据的时候不需要扫描全部数据(磁盘IO),只需查询指定列即可. ...
- Hive(10)-文件存储格式
Hive支持的存储数据的格式主要有:TEXTFILE .SEQUENCEFILE.ORC.PARQUET 一. 列式存储和行式存储 左边为逻辑表,右边第一个为行式存储,第二个为列式存储 1. 行式存储 ...
- 【图解】Hive文件存储格式
摘自:https://blog.csdn.net/xueyao0201/article/details/79103973 引申阅读原理篇: 大数据:Hive - ORC 文件存储格式 大数据:Parq ...
- Hive-ORC文件存储格式
ORC文件格式是从Hive-0.11版本开始的.关于ORC文件格式的官方文档,以及基于官方文档的翻译内容这里就不赘述了,有兴趣的可以仔细研究了解一下.本文接下来根据论文<Major Techni ...
- hive常见的存储格式
Hive常见文件存储格式 背景:列式存储和行式存储 首先来看一下一张表的存储格式: 字段A 字段B 字段C A1 B1 C1 A2 B2 C2 A3 B3 C3 A4 B4 C4 A5 B5 C5 行 ...
- Hive文件存储格式
hive文件存储格式 1.textfile textfile为默认格式 存储方式:行存储 磁盘开销大 数据解析开销大 压缩的text文件 hive无法进行合并和拆分 2.sequencef ...
- Hive文件存储格式和hive数据压缩
一.存储格式行存储和列存储 二.Hive文件存储格式 三.创建语句和压缩 一.存储格式行存储和列存储 行存储可以理解为一条记录存储一行,通过条件能够查询一整行数据. 列存储,以字段聚集存储,可以理解为 ...
随机推荐
- 机器学习基石:13 Hazard of Overfitting
泛化能力差和过拟合: 引起过拟合的原因: 1)过度VC维(模型复杂度高)------确定性噪声: 2)随机噪声: 3)有限的样本数量N. 具体实验来看模型复杂度Qf/确定性噪声.随机噪声sigma2. ...
- CSAPP-链接
主要任务: 1.符号解析 在声明变量和函数之后,所有的符号声明都被保存到符号表. 而符号解析阶段会给每个符号一个定义. 2.重定位: 把每个符号的定义与一个内存位置关联起来,然后修改所有对这些符号的引 ...
- hdu 5113(2014北京—搜索+剪枝)
题意:有N*M的棋盘,用K种颜色去染,要求相邻块不能同色.已知每种颜色要染的块数,问能不能染,如果能,输出任一种染法. 最开始dfs失败了- -,优先搜索一行,搜完后进入下一列,超时.本来以为搜索不行 ...
- 例10-1 uva11582(裴波那切数列)
题意:你的任务是计算f(a^b)除以n的余数.其中f(0)=f(1)=1,且对于所有非负整数i,f(i+2)=f(i+1)+f(i). 思路: 由于是模运算,因此整个序列肯定会出现重复序列,所以先找出 ...
- Android技术分享-文字转语音并朗读
Android技术分享-文字转语音并朗读 最近在做一个项目,其中有一个功能是需要将文本转换成语音并播放出来.下面我将我的做法分享一下. 非常令人开心的是,Android系统目前已经集成了TTS,提供了 ...
- C语言程序设计第一次实验
一. 1.输入圆的半径,计算圆的面积周长问题 2流程图 3测试数据及运算结果 4实验分析 不会输入r,后来问了同学得到解决. 二. 1.输入一个四位年份,判断其是否是闰年.闰年的判别条件是概念年份能被 ...
- Windows Server2003本地用户的批量导入和导出(转)
AD域环境的用户导入和导出 Windows server 2003 批量导入用户---CSVDE 在新搭建的域环境中,有许多的域帐号需要导入,可以采用csvde命令来导入域用户:新建一个txt文本文件 ...
- break 与 continue
1.break ①只有一层循环时,作用是跳出循环语句,执行后面的代码. ②break存在于循环嵌套的内层循环时,只能跳出内层循环,如果想要跳出外层循环,需要对外层循环添加标记. 2.continue ...
- intellij配置hibernate自动生成hbm.xml文件
1.首先创建一个Java web项目,这里因为已经在整个项目中配置好tomcat了,所以我是直接创建module的,其实和创建project的配置方法一样,创建的时候选择Web Application ...
- Java阻塞队列的实现
阻塞队列与普通队列的区别在于,当队列是空的时,从队列中获取元素的操作将会被阻塞,或者当队列是满时,往队列里添加元素的操作会被阻塞.试图从空的阻塞队列中获取元素的线程将会被阻塞,直到其他的线程往空的队列 ...