当我编写外部表的脚本时,我使用指定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')