【问题标题】:How does Hive know how the data file is compressed when doing queryHive在查询时如何知道数据文件是如何压缩的
【发布时间】:2019-12-20 04:16:11
【问题描述】:

我用create table t(name string, age int) stored as parquet 创建了一个配置单元表。 然后我插入一些数据,有的使用gzip压缩,有的使用snappy压缩。即对应的HDFS目录下有gzip文件和snappy文件。 查询时看到gzipsnappy中的数据都被查询出来了,我的问题是Hive在处理文件的时候是如何检测到使用的是哪个压缩编解码器?

【问题讨论】:

    标签: hadoop hive compression


    【解决方案1】:

    仅检查元数据并获取压缩信息是不够的。您可以轻松地将压缩和未压缩文件混合在一个表目录中,它会起作用。所以在文件本身中为每个文件定义了压缩编解码器。

    这个关于编解码器的信息写在文件的哪个部分?

    这取决于文件类型。

    表元数据包含有关文件类型的信息(可以在表 DDL 中指定为STORED AS ...

    所以,首先 Hive 读取元数据来获取文件类型。

    根据文件类型(文本、orc、parquet 等),编解码器信息存储在文件页眉或页脚中。

    每种文件类型都有对应的阅读器。 读者知道如何阅读编解码器信息。例如the ORC reader reads the last 16k bytes of the file with the hope that it will contain both the Footer and Postscript sections。 ORC 中的 PostScript 部分包含编解码器信息。

    文本文件在标题中包含编解码器信息,等等... 所以,简短的回答是:相应的文件阅读器知道从哪里获取有关压缩编解码器的信息。

    【讨论】:

    • 感谢@leftjoin。你是对的,它回答了问题1
    【解决方案2】:

    Hive 检测它的方式与您描述表格的方式相同:

    DESCRIBE [EXTENDED|FORMATTED] table_name(详细信息https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL

    上面的命令将显示所有表属性,无论它是压缩的还是它正在使用哪种类型的压缩,以及与您的 hive 表相关的大量其他属性。

    因此,在读取您的查询时,“HQL 引擎”会首先读取您的表的元数据,因为 HIVE 遵循 Schema on read 现象(更多详细信息 http://www.centurylink.com/business/enterprise/blog/thinkgig/data-lakes-schema-on-read-vs-schema-on-write/

    【讨论】:

      【解决方案3】:

      在 hive 中创建表时,我们定义以下字段。

      行格式 SERDE

      存储为文件格式

      位置 hdfs_path

      文件格式 列位置和分隔符..

      查看表定义。已添加compression / decompression

      【讨论】:

      • 感谢@sandeep。我的问题是,当数据在表对应的HDFS目录下时,有的是snappy压缩文件,有的是gzip压缩文件。当 Hive 查询这些文件时,Hive 如何知道解压缩文件时使用哪个编解码器。
      • 自动检测到压缩/解压完成我在答案中添加了链接
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-06-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-06
      • 1970-01-01
      • 2021-07-28
      相关资源
      最近更新 更多