我创建了一个hive表,其中create table t(name string,age int)存储为镶木地板。 然后我插入一些数据,一些使用gzip压缩,一些使用snappy压缩。也就是说,相应的HDFS目录中有gzip文件和snappy文件。 当我进行查询时,我看到gzip和snappy中的数据都被查询了,我的问题是Hive如何检测处理文件时使用的压缩编解码器?
答案 0 :(得分:2)
仅仅检查元数据并获取压缩信息是不够的。您可以轻松地将压缩文件和未压缩文件混合在一个表目录中,它将起作用。因此,为文件本身中的每个文件定义了压缩编解码器。
文件的哪一部分是关于编解码器的信息写的?
取决于文件类型。
表元数据包含有关文件类型的信息(可以在表DDL中指定为STORED AS ...
)
因此,首先Hive读取元数据以获取文件类型。
根据文件类型(文本,orc,镶木地板等),编解码器信息存储在文件页眉或页脚中。
每种文件类型都有相应的阅读器。 读者知道如何阅读编解码器信息。例如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部分包含编解码器信息。
文本文件在标题中包含编解码器信息,依此类推...... 因此,简短的回答是:相应的文件阅读器知道从何处获取有关压缩编解码器的信息。
答案 1 :(得分:0)
Hive以与描述表格相同的方式检测到它:
DESCRIBE [EXTENDED | FORMATTED] table_name(详情https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL)
上面的命令将显示所有表属性,无论它是压缩的还是正在使用的压缩类型以及与您的hive表相关的大量其他属性。
所以在阅读你的查询" HQL引擎"首先读取表格的元数据,因为HIVE遵循关于读取现象的模式(更多细节http://www.centurylink.com/business/enterprise/blog/thinkgig/data-lakes-schema-on-read-vs-schema-on-write/)
答案 2 :(得分:0)
在hive中创建表时,我们定义以下字段。
行格式SERDE
STORED AS file_format
LOCATION hdfs_path
File_format
列位置和分隔符..
查看表格定义。