在 Amazon Athena 中创建 Table 时转换时间戳
Convert Time Stamp while Creating Table in Amazon Athena
我一直在使用下面的查询在 Athena 中创建一个 table,
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")
这个return是我:
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
我想return:
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
并将 converteddate 作为 datetime 而不是 string.
创建时无法转换数据table。但是可以边查询边获取数据。
您可以使用 date_parse(string,format) -> timestamp 函数。此处提到了更多详细信息。
对于您的用例,您可以执行如下操作
select date_parse(converteddate, '%y-%m-%dT%H:%i:%s') as converted_timestamp, userid
from test_table
注意:根据您的字符串类型,您必须为月(是否始终为两位数)、日、小时(12 或 24 小时格式)等选择适当的说明符
(我的回答有一个前提:您使用的是 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 table,结果将是:
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 包括毫秒。
我写了一篇关于在 OpenCSVSerDe 中使用类型 TIMESTAMP 和 DATE 的更全面的解释。你可以阅读.
我一直在使用下面的查询在 Athena 中创建一个 table,
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")
这个return是我:
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
我想return:
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
并将 converteddate 作为 datetime 而不是 string.
创建时无法转换数据table。但是可以边查询边获取数据。 您可以使用 date_parse(string,format) -> timestamp 函数。此处提到了更多详细信息。
对于您的用例,您可以执行如下操作
select date_parse(converteddate, '%y-%m-%dT%H:%i:%s') as converted_timestamp, userid
from test_table
注意:根据您的字符串类型,您必须为月(是否始终为两位数)、日、小时(12 或 24 小时格式)等选择适当的说明符
(我的回答有一个前提:您使用的是 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 table,结果将是:
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 包括毫秒。
我写了一篇关于在 OpenCSVSerDe 中使用类型 TIMESTAMP 和 DATE 的更全面的解释。你可以阅读