У меня есть дата в S3, с помощью которой я создал таблицу Athena. У меня есть записи даты в S3 в формате json, которые Афина не принимает ни как дату, ни как метку времени при выполнении запросов.
Использование AWS Athena, использующего Prestodb в качестве механизма запросов
Пример 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_parse (строка, формат).
date_parse(creationdate, ‘%Y-%m-%d’)
Вместо предоставления формата отметки времени вы можете использовать функцию from_iso8601_timestamp.
Таким образом, будут проанализированы все временные метки.
select from_iso8601_timestamp(creationdate) from table1;
Потрясающе, Йенс, во всех случаях работало. Спасибо. +1 за ваше решение
@jens walter: сэкономил много времени и сил / \
Использовать этот:
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');
нет необходимости делать time_diff и, следовательно, анализ миллисекунд был важен.