如何将字段转换为配置单元中的时间戳

时间:2017-09-11 16:16:47

标签: hadoop hive

如何将第四个字段转换为时间戳?我已经加载到一个表中,但在查询时它显示为NULL。

1 :: 1193 :: 5 ::的 978300760

我的表格格式:

CREATE TABLE `mv`(
  `uid` INT, 
  `mid` INT, 
  `rating` INT, 
  `tmst` TIMESTAMP)
ROW FORMAT SERDE 
  'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe' 
WITH SERDEPROPERTIES ( 
  'field.delim'='::', 
  'serialization.format'='::') 
STORED AS INPUTFORMAT 
  'org.apache.hadoop.mapred.TextInputFormat' 
OUTPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'

现在,在最后一列tmst中,我想以某种格式存储时间戳,但在输入文件中我有unix时间戳(如-7367354673)。现在我的问题是我是否必须将该unix时间戳转换为可读格式并将其作为时间戳或字符串存储在表中?哪个最好?我尝试将其存储为时间戳,但在查询时会给出NULL值。

2 个答案:

答案 0 :(得分:1)

1。

您使用的是错误的SerDe LazySimpleSerDe不支持多字符分隔符 当您尝试使用它时,帐户中只会占用一个字符,因此您的分隔符几乎为:(而不是::)。
记录1::1193::5::978300760解释如下:

C     = Column
D     = Delimiter
(E/N) = Empty/Null

C1  D1   C2(E/N) D2 C3    D3  C4(E/N) D4 C5  D5 C6 D6  C7
|   |    |       |  |     |   |       |  |   |  |  |   |
1   :            :  1193  :           :  5   :     :   978300760  

P.S。由于您的表有4列,因此忽略第4个字段后的所有内容

2

tmst(大纪元)应定义为bigint

MultiDelimitSerDe + BIGINT

create external table mv
(
    uid     int
   ,mid     int 
   ,rating  int 
   ,tmst    bigint
)
row format serde 'org.apache.hadoop.hive.contrib.serde2.MultiDelimitSerDe'
with serdeproperties ("field.delim"="::")
stored as textfile
;
select * from mv
;
+--------+--------+-----------+-----------+
| mv.uid | mv.mid | mv.rating |  mv.tmst  |
+--------+--------+-----------+-----------+
|      1 |   1193 |         5 | 978300760 |
+--------+--------+-----------+-----------+

答案 1 :(得分:0)

当列值和列数据类型不匹配时显示空输出。

我猜,您已将timestamp列数据类型指定为timestamp。如果您不将其转换为时间戳格式并且要在表中显示,则必须将此数据类型指定为此列的bigint数据类型。

如果要转换,请使用以下语法。

select from_unixtime(978300760,"yyyy-MM-dd HH:mm:ss.SSSS") ;
select from_unixtime(columnname,"yyyy-MM-dd HH:mm:ss.SSSS") as timestamp;