1. 絮絮叨叨
- Apache ORC官网,把ORC文件的结构讲的那么精妙,甚至让人云里雾里
- 如果不借助工具查看ORC文件的元数据或者阅读源码,你可能无法在脑海中形成ORC文件结构
- 本文将基于一张前10列加密、后10列不加密的Hive表
test.tmp_hgs_orc_xxx
,介绍如何查看ORC文件的元数据,以帮助大家更好地理解ORC文件的存储结构 - 很多方式都可以查看ORC文件的元数据,本文将介绍hive命令和Java Tools两种方式
- 官网在Spark DDL和C++ Tools部分,也介绍了如何查看ORC文件的元数据。感兴趣的小伙伴可以自己研究,同时也欢迎交流 ~
2. 准备工作 —— 获取ORC文件的HDFS路径
-
Hive表中的数据以ORC格式存储,将以
.orc
为扩展名存入HDFS中 -
查看ORC文件的元数据,也就是对
.orc
文件进行分析 -
不管通过哪种方式查看ORC文件的元数据,首先得知道ORC文件的HDFS路径
-
首先,通过
show create table xxxx
语句,知道Hive表的存储路径show create table test.tmp_hgs_orc_xxx;
-
表结构,如图所示:
-
接着,通过
hdfs dfs -ls
命令查看该表对应的ORC文件
-
该表只存储了一个ORC文件,
part-00000-eccb0061-f704-4eff-82f5-815bb8cacfb0-c000.snappy.orc
,基于该文件进行分析
3. 借助Hive命令查看ORC文件的元数据
-
查看ORC文件的元数据的hive命令如下:
hive --orcfiledump <path_to_file>
-
具体使用时,加上ORC文件的HDFS路径即可
hive --orcfiledump /hive/warehouse/test.db/tmp_hgs_orc_xxx/part-00000-eccb0061-f704-4eff-82f5-815bb8cacfb0-c000.snappy.orc
-
查看结果部分截图如下:
-
注意: 从Hive 1.1开始,支持打印ORC文件中的数据,命令如下:
hive --orcfiledump -d <path_to_file>
4. 借助ORC官网的Java Tools查看ORC文件的元数据
- 使用hive命令查看ORC文件的元数据时,发现无法识别带有加密列的文件中的ENCRYPTED_INDEX、ENCRYPTED_DATA两种类型的stream
- 考虑到Hive版本可能比较旧,且ORC从1.6开始支持列加密,因此使用ORC官网1.6及以后版本的的Java Tools是个不错的选择
4.1 下载Java Tools
-
Java Tools有很多版本,本文选择使用1.6.12这个stable release的版本,下载orc-tools-1.6.12-uber.jar
-
linux系统,可以通过wget命令进行下载
wget https://repo1.maven.org/maven2/org/apache/orc/orc-tools/1.6.12/orc-tools-1.6.12-uber.jar
4.2 下载ORC文件到本地
-
Java Tools分析ORC文件时,不能直接基于存储在HDFS中的文件进行分析,需要先下载到本地
-
下载命令如下:
hdfs dfs -get <hdfs-path> <local-file-name> hdfs dfs -get /hive/warehouse/test.db/tmp_hgs_orc_xxx/part-00000-eccb0061-f704-4eff-82f5-815bb8cacfb0-c000.snappy.orc xxx-eccb0061.snappy.orc
-
下载完成后,本地将出现xxx-eccb0061.snappy.orc文件
4.3 查看ORC文件的元数据
-
使用Java Tools查看ORC文件元数据的命令如下:
java -jar orc-tools-X.Y.Z-uber.jar meta <path-to-local-orc-file>
-
使用示例:
java -jar orc-tools-1.6.12-uber.jar meta xxx-eccb0061.snappy.orc
5. 分析ORC文件的元数据
5.1 表的整体信息
- 整体信息如下,包含文件名、文件length、压缩方式、type信息、加密列等信息
File Version: 0.12 with ORC_14 by ORC Java 1.6.11
-
File Version: 0.12
,对应PostScript.version,表示可以读取该ORC的最低Hive版本 -
ORC_14
:对应PostScript.writerVersion,表示写该ORC文件的writer版本 -
ORC Java
:对应Footer.writer,表示通过哪种writer实现写的ORC文件,如ORC Java、ORC C++、Presto等 -
1.6.11
: 对应Footer.softwareVersion,记录Footer.writer的软件版本。 -
ORC Java 1.6.11
表示,使用1.6.11版本的Java orc writer,对应maven依赖应该是<dependency> <groupId>org.apache.orc</groupId> <artifactId>orc-core</artifactId> <version>1.6.11</version> </dependency>
Calendar: Julian/Gregorian
- 对应Footer.calendar,表示使用Julian/Gregorian类型的Calendar
5.2 Stripe Statistics
- stripe statistics,也就是stripe级别的index,展示每个stripe的index
- 从stripe statistics可知,该orc文件中只有一个stripe
- 前10列为加密,使用nullify掩码,列中的每个值都为null。
- 因此,
hasNull
为true,count
为0(表示所有值都为null) ;数值列没有min、max,sum为默认值0
5.3 File Statistics
- 该ORC文件只有一个stripe,stripe级别的index就是文件级别的index(index和statistics可以看做同义词)
5.4 Stripes
-
Stripes部分记录了stripe的详细信息,其中start都是相对整个文件头部而言
-
首先是stripe的offset、各部分的长度、数据行数、index streams
-
注意:
下图中,第2点描述有问题:
第一个stripe的offset为3,修正为:ORC文件的header固定为ORC
,占据3 bytes(并非stripe header固定3 bytes)
-
接着,是stripe的data streams
-
省略部分data streams,剩余的data streams如下:
-
最后,是stripe中列的编码信息(encodings)
5.5 其他
- 最后,展示了文件的长度、Padding信息(AES_CTR加密的padding?),以及User Metadata(key-value类型的额外信息)
参考链接: