我如何在hive中接受作为时间戳的字符串创建时间戳字段?
我已经在pig中格式化了字符串以匹配hive中的时间戳格式,但是在加载后它是null而不是显示日期。
2014-04-10 09:45:56这就是猪格式的样子,这与格式与hive时间戳匹配,但无法加载。 (仅当我加载到字符串字段中时)
任何想法为什么?
快速更新:没有hcatalog可用
问题是某些情况下,timestamp字段包含空值,并且在使用timestamp数据类型时,所有字段都变为null。将时间戳添加到所有行都采用上述格式的列时,它可以正常工作。所以真正的问题是如何处理空值
答案 0 :(得分:1)
我怀疑您已使用PigStorage将数据写入HDFS,并且您希望将其加载到Hive表中。问题是Pig将缺少的元组字段写为null,Hive 0.11将其视为null。到现在为止还挺好。 但随后所有后续字段都将被视为null,但它们可以具有不同的值。 Hive 0.12没有这个问题。
根据SerDe类型,Hive 可以将不同的字符串解释为null 。如果LazySimpleSerDe
为\N
。
您有两个选择:
\N
存储在Pig for null fields E.g:
鉴于Pig 0.11中的以下数据:
A = load 'data' as (txt:chararray, ts:chararray);
dump A;
(a,2014-04-10 09:45:56)
(b,2014-04-11 10:45:56)
(,)
(e,2014-04-12 11:45:56)
选项1:
store A into '/user/data';
Hive 0.11:
CREATE EXTERNAL TABLE test (txt string, tms TimeStamp)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t'
LOCATION '/user/data';
alter table test SET SERDEPROPERTIES('serialization.null.format' = '');
选项2:
...
B = foreach A generate txt, (ts is null?'\\N':ts);
store B into '/user/data';
然后在Hive中创建表而不设置serde属性。