从猪创建蜂巢时间戳

时间:2014-04-10 11:11:43

标签: hive apache-pig

我如何在hive中接受作为时间戳的字符串创建时间戳字段?

我已经在pig中格式化了字符串以匹配hive中的时间戳格式,但是在加载后它是null而不是显示日期。

2014-04-10 09:45:56这就是猪格式的样子,这与格式与hive时间戳匹配,但无法加载。 (仅当我加载到字符串字段中时)

任何想法为什么?

快速更新:没有hcatalog可用

问题是某些情况下,timestamp字段包含空值,并且在使用timestamp数据类型时,所有字段都变为null。将时间戳添加到所有行都采用上述格式的列时,它可以正常工作。所以真正的问题是如何处理空值

1 个答案:

答案 0 :(得分:1)

我怀疑您已使用PigStorage将数据写入HDFS,并且您希望将其加载到Hive表中。问题是Pig将缺少的元组字段写为null,Hive 0.11将其视为null。到现在为止还挺好。 但随后所有后续字段都将被视为null,但它们可以具有不同的值。 Hive 0.12没有这个问题。

根据SerDe类型,Hive 可以将不同的字符串解释为null 。如果LazySimpleSerDe\N

您有两个选择:

  • 将表格的null格式属性设置为由Pig
  • 生成的空字符串
  • 或将\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属性。