在亚马逊Athena中创建表时转换时间戳

时间:2018-01-03 14:41:40

标签: amazon-athena

我一直在使用以下查询在Athena中创建一个表,

CREATE EXTERNAL TABLE IF NOT EXISTS test.test_table (
      `converteddate` string,
      `userid` string,
    )
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
WITH SERDEPROPERTIES (
  'serialization.format' = ',',
  'field.delim' = ','
) LOCATION 's3:XXXX'
TBLPROPERTIES ('has_encrypted_data'='false',"skip.header.line.count"="1")

这让我回报:

converteddate        | userid
-------------------------------------
2017-11-29T05:00:00  | 00001
2017-11-27T04:00:00  | 00002
2017-11-26T03:00:00  | 00003
2017-11-25T02:00:00  | 00004
2017-11-24T01:00:00  | 00005

我想回复:

converteddate        | userid
-------------------------------------
2017-11-29 05:00:00  | 00001
2017-11-27 04:00:00  | 00002
2017-11-26 03:00:00  | 00003
2017-11-25 02:00:00  | 00004
2017-11-24 01:00:00  | 00005

并将 convertdate 作为日期时间,而不是字符串

2 个答案:

答案 0 :(得分:3)

创建表时无法转换数据。但是您可以在查询时获取数据。 您可以使用date_parse(字符串,格式) - >时间戳功能。这里提到更多细节。

对于您的用例,您可以执行以下操作

select date_parse(converteddate, '%y-%m-%dT%H:%i:%s') as converted_timestamp, userid
from test_table

注意:根据您的字符串类型,您必须选择适当的月份说明符(始终为两位数),日,小时(12或24小时格式)等

答案 1 :(得分:0)

(我的回答有一个前提:您正在使用OpenCSVSerDe。例如,它不适用于LazySimpleSerDe。)

如果可以选择更改输入CSV文件的格式,则应将时间戳转换为UNIX Epoch Time。这就是OpenCSVSerDe期望的格式。

例如,您的示例CSV如下所示:

"converteddate","userid"    
"2017-11-29T05:00:00","00001"
"2017-11-27T04:00:00","00002"
"2017-11-26T03:00:00","00003"
"2017-11-25T02:00:00","00004"
"2017-11-24T01:00:00","00005"

应该是:

"converteddate","userid"
"1511931600000","00001"
"1511755200000","00002"
"1511665200000","00003"
"1511575200000","00004"
"1511485200000","00005"

这些整数是自1970年1月1日午夜起每个原始日期的毫秒数。

然后,您可以运行CREATE TABLE语句的稍作修改的版本:

CREATE EXTERNAL TABLE IF NOT EXISTS test.test_table (
      converteddate timestamp,
      userid string
    )
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
LOCATION 's3:XXXX'
TBLPROPERTIES ("skip.header.line.count"="1");

如果您使用select * from test_table查询Athena表,则会得到以下结果:

       converteddate        userid  
 ------------------------- -------- 
  2017-11-29 05:00:00.000    00001  
  2017-11-27 04:00:00.000    00002  
  2017-11-26 03:00:00.000    00003  
  2017-11-25 02:00:00.000    00004  
  2017-11-24 01:00:00.000    00005  

如您所见,在Athena上键入TIMESTAMP包括毫秒。

我写了关于将TIMESTAMP和DATE与OpenCSVSerDe一起使用的更全面的解释。您可以阅读here