借助hive命令或ORC官网的Java Tools查看ORC文件的元数据

1. 絮絮叨叨

  • Apache ORC官网,把ORC文件的结构讲的那么精妙,甚至让人云里雾里
  • 如果不借助工具查看ORC文件的元数据或者阅读源码,你可能无法在脑海中形成ORC文件结构
  • 本文将基于一张前10列加密、后10列不加密的Hive表test.tmp_hgs_orc_xxx,介绍如何查看ORC文件的元数据,以帮助大家更好地理解ORC文件的存储结构
  • 很多方式都可以查看ORC文件的元数据,本文将介绍hive命令Java Tools两种方式
  • 官网在Spark DDLC++ 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类型的额外信息)

参考链接:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值