如何将第四个字段转换为时间戳?我已经加载到一个表中,但在查询时它显示为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值。
答案 0 :(得分: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个字段后的所有内容
tmst
(大纪元)应定义为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;