雅典娜date_parse用于日期(可选毫秒字段)

时间:2018-09-12 21:57:07

标签: sql amazon-athena presto

我在S3中有个日期,通过它我创建了一个雅典娜表。我有一些json格式的S3日期条目,雅典娜在运行查询时不接受日期或时间戳记。

使用将Prestodb用作查询引擎的AWS Athena

示例json:


    {"creationdate":"2018-09-12T15:49:07.269Z", "otherfield":"value1"}
    {"creationdate":"2018-09-12T15:49:07Z", "otherfield":"value2"}

AWS Glue将两个字段都当作字符串,并且分别将它们更改为时间戳和日期时,围绕时间戳的查询无法正常工作,在时间戳字段上给出ValidationError。

无论如何,我找到了一种使用prestodb date_parse函数的方法,但是它无法正常工作,因为某些字段有毫秒,而另一些字段没有毫秒。


    parse_datetime(creationdate, '%Y-%m-%dT%H:%i:%s.%fZ')
    parse_datetime(creationdate, '%Y-%m-%dT%H:%i:%sZ')

由于出现的条目不同,两者均失败,即,其中一个条目包含毫秒级%f,而另一个条目不包含 有没有办法提供解析器,正则表达式,以便能够在执行SQL查询期间将这些字符串转换为Date?

3 个答案:

答案 0 :(得分:2)

您可以使用from_iso8601_timestamp函数来代替时间戳格式。

这样,所有时间戳都会被解析。

select from_iso8601_timestamp(creationdate) from table1;

答案 1 :(得分:0)

你只需要约会吗?

如果是这样,您可以使用date_parse(字符串,格式)。

date_parse(creationdate, ‘%Y-%m-%d’)

答案 2 :(得分:0)

使用此:

SELECT requestdatetime, remoteip, requester, key
       FROM MYDB.TABLE
       WHERE parse_datetime(requestdatetime,'dd/MMM/yyyy:HH:mm:ss Z') 
       BETWEEN parse_datetime('2020-10-14:00:00:00','yyyy-MM-dd:HH:mm:ss')
           AND parse_datetime('2020-10-14:23:59:59','yyyy-MM-dd:HH:mm:ss');