6

我正在尝试将 Gzip 存档中的数据加载到 Hive 表中,但我的 gzip 文件具有扩展名,例如:

apache_log.gz_localhost

当我指定这些文件所在的 HDFS 目录位置时,Hive 无法识别 GZip 压缩文件,因为它正在搜索扩展名为 .gz 的文件。

将数据加载到 Hive 时是否可以定义文件类型?像(伪)这样的东西:

设置 input.format=gzip;

加载数据路径 /tmp/logs/ INTO TABLE apache_logs;

这是我用于创建表的 SQL:

CREATE EXTERNAL TABLE access_logs (
`ip`                STRING,
`time_local`        STRING,
`method`            STRING,
`request_uri`       STRING,
`protocol`          STRING,
`status`            STRING,
`bytes_sent`        STRING,
`referer`           STRING,
`useragent`         STRING,
`bytes_received`    STRING
)
ROW FORMAT SERDE 'org.apache.hadoop.hive.contrib.serde2.RegexSerDe'
WITH SERDEPROPERTIES (
'input.regex'='^(\\S+) \\S+ \\S+ \\[([^\\[]+)\\] "(\\w+) (\\S+) (\\S+)" (\\d+) (\\d+|\-) "([^"]+)" "([^"]+)".* (\\d+)'
)
STORED AS TEXTFILE
LOCATION '/tmp/logs/';
4

1 回答 1

7

为什么不将文件名更改为xxx.gz放入 HDFS 后?

如果你真的想支持.gz_localhost,我认为您可以自定义自己的GzipCodec来实现它:

  1. 创建一个你自己的NewGzipCodec扩展类GzipCodec

    公共类 NewGzipCodec 扩展 org.apache.hadoop.io.compress.GzipCodec { }

  2. 覆盖方法getDefaultExtension

    public String getDefaultExtension() { return ".gz_locahost"; }

  3. javac 并压缩NewGzipCodec.classNewGzipCodec.jar

  4. 上传NewGzipCodec.jar{$HADOOP_HOME}/lib

  5. 设置你的core-site.xml

<property>
  <name>io.compression.codecs</name>
  <value>NewGzipCodec, org.apache.hadoop.io.compress.DefaultCodec,org.apache.hadoop.io.compress.GzipCodec,org.apache.hadoop.io.compress.BZip2Codec</value>
</property>
于 2013-06-17T16:15:41.050 回答