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

Hadoop 如何在配置单元中将字段转换为时间戳,hadoop,hive,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 (

如何将第四个字段转换为时间戳?我已加载到一个表中,但在查询时它显示为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时间戳转换为可读格式,并将其作为时间戳或字符串存储到表中?哪一个最好?我尝试将其存储为时间戳,但在查询时,它给出空值。

空输出显示列值和列数据类型不匹配的情况

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

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

select from_unixtime(978300760,"yyyy-MM-dd HH:mm:ss.SSSS") ;
select from_unixtime(columnname,"yyyy-MM-dd HH:mm:ss.SSSS") as timestamp;
1. 您使用了错误的服务器。
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  
另外,由于您的表有4列,第4个字段之后的所有内容都将被忽略

2.
tmst
(Epoch)应定义为
bigint


MultiSerde+BIGINT


您的表定义是什么?使用
show create table…
并将其添加到原始postso在表中定义时间戳列时,我们应该如何做,我们应该将其定义为时间戳还是字符串?什么是最好的?我在一个文本文件中有unixtime,希望将其转换为时间戳并存储在一个表中,这样我就可以使用它进行查询/联接等。建议始终为每个列使用相应的数据类型。如果您有时间戳值。例如,如果列值类似于2017-05-23 18:33:29,则使用时间戳数据类型,如果没有时间,则使用日期类型。如果将时间戳列数据定义为字符串,则无法根据时间、年份、日期、月份等进一步筛选或查询数据。。。如果定义字符串以外的任何其他类型,则时间戳将显示null。如果您觉得有用,请向上投票。到目前为止,我的文件中只有unix时间戳(如978300760),那么如何将其转换为时间戳格式(如yyyy-MM-dd HH:MM:ss),并将其作为时间戳存储在表中,以便在查询表时不会显示空值。请检查我上面给出的答案。@akm,这并不能解决空值问题。如果你想问一个额外的问题(例如“如何将历元转换为时间戳?”),打开一个额外的帖子,尽管你在SO中已经有无数关于这个主题的帖子。非常感谢:)的清晰解释。假设我想将历元转换为人类可读的格式(比如yyyy-MM-dd-HH:MM:ss)并将其存储在表中,那么我应该如何定义tmst列,以及在将数据加载到表中时如何将其转换。MultiDefinitSerde抛出以下错误
失败:执行错误,从org.apache.hadoop.hive.ql.exec.ddlstask返回代码1。无法验证serde:org.apache.hadoop.hive.contrib.serde2.MultiDelimSerDe
(1)这是已测试的代码。当我专门编写
MultiDelimSerDe
时,为什么要尝试使用
MultiDelimSerDe
?(2) 如果不查询它,您无法转换它,因此您首先必须正确定义一个表。我拼写错误:(.现在它工作正常。:)非常感谢您的回复。
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 |
+--------+--------+-----------+-----------+