为什么在S3上创建Hive外部表时我的JSON SerDe没有被使用?

时间:2015-06-24 22:24:49

标签: json amazon-s3 hive

当我编写外部表的脚本时,我使用指定ROW FORMAT SERDE,但是当我调用SHOW CREATE TABLE时,它没有使用该SerDe并且数据未被正确解析。我正在使用Proof Point SerDe jar来获取JSON https://github.com/proofpoint/hive-serde

结果表将JSON放入第一列,我为我指定的其余列获取空值(如果实际上没有使用解析JSON的SerDe,这是有意义的。)

我使用的Hive版本是0.11.0。

对我来说很奇怪的是,Hive说它正确地创建了表而没有错误,但是返回的create语句表明Hive只是没有使用我指定的SerDe。为什么会这样,我怎么能让它工作?

关于我做了什么和一些代码的更多背景

确保我必须使用SerDe jar:

locate hive-serde-1.0.jar

在Hive shell中,添加了jar以确保Hive可以访问它:

add jar /home/hadoop/.versions/2.4.0/share/hadoop/common/lib/hive-serde-1.0.jar;

对上述命令的响应表明它工作正常:

Added /home/hadoop/.versions/2.4.0/share/hadoop/common/lib/hive-serde-1.0.jar to class path
Added resource: /home/hadoop/.versions/2.4.0/share/hadoop/common/lib/hive-serde-1.0.jar

然后我编写表格的脚本:

create external table if not exists db.new_table(
        time string,
        type string,
        id string,
        sample_interval int
    )
    partitioned by (dt string, hour string)
    ROW FORMAT SERDE 'com.proofpoint.hive.serde.JsonSerde'
    WITH SERDEPROPERTIES ('errors.ignore' = 'true')
    location 's3n://bucket/directory_path';

Hive表示已成功创建。为了检查它是否以正确的方式创建,我然后调用以下内容:

show create table new_table;    

并得到回应:

 CREATE EXTERNAL TABLE new_table(
  time string COMMENT 'from deserializer',
  type string COMMENT 'from deserializer',
  id string COMMENT 'from deserializer',
  sample_interval int COMMENT 'from deserializer')
PARTITIONED BY (
  dt string,
  hour string)
ROW FORMAT DELIMITED
STORED AS INPUTFORMAT
  'org.apache.hadoop.mapred.TextInputFormat'
OUTPUTFORMAT
  'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
  's3n://bucket/directory_path'
TBLPROPERTIES (
  'transient_lastDdlTime'='1435182901')

0 个答案:

没有答案