Использование TO_DATE в Apache Drill для преобразования UNIXTIMESTAMP в читаемый человеком формат времени
Мой файл JSON содержит поле метки времени в формате метки времени загрузки UNIX, например 1501580484655
, Это преобразует в GMT: 01-08-2017 9:41:24.655
AM
Моя попытка преобразовать эту метку времени в читаемый человеком формат времени до миллисекунды не работает.
Я пробовал ниже до сих пор:
1- select TO_DATE(1501580484655) from (VALUES(1));
O / P является 2017-08-01
что нормально до даты, но я хочу до миллисекунды.
2- select TO_DATE(1501580484655,'yyyy-MM-dd HH:mm:ss.SSS') from (VALUES(1));
O / P это: Error: SYSTEM ERROR: IllegalArgumentException: Invalid format: "1501580484655" is malformed at "4655"
3- select TO_DATE(1501580484,'yyyy-MM-dd HH:mm:ss.SSS') from (VALUES(1));
O / P это: Error: SYSTEM ERROR: IllegalArgumentException: Invalid format: "1501580484" is malformed at "4"
4- select TO_DATE(150158048,'yyyy-MM-dd HH:mm:ss.SSS') from (VALUES(1));
O / P это: Error: SYSTEM ERROR: IllegalArgumentException: Invalid format: "150158048" is too short
5- SELECT TO_TIMESTAMP(1501580484655) from (VALUES(1));
Это работает, хотя. O / P является 49553-03-11 18:10:55.0
, И когда я удаляю последние три символа 655, тогда я получаю O / P как 2017-08-01 09:41:24.0
Но когда я запускаю этот запрос в столбце метки времени загрузки из файла json, я получаю:
5а - select TO_TIMESTAMP(SUBSTR((cast(UploadTimeStamp as INTEGER)),1,10)) from dfs.root.
/тестовое задание/limit 5;
O / P это:
`Error: SYSTEM ERROR: SchemaChangeException: Failure while trying to materialize incoming schema. Errors:
Error in expression at index -1. Error: Missing function implementation: [castTINYINT(VARCHAR-OPTIONAL)]. Full expression: --UNKNOWN EXPRESSION--..
Fragment 1:3
[Error Id: 7a91a9f8-9776-4f0d-9b9f-da3e65cc282a on rjio-devcluster1-BigdataNode1:31010] (state=,code=0)
Пробное приведение к различным типам данных, но та же самая ошибка прибывает. Пробовал без приведения и такая же ошибка приходит.
Какой должен быть правильный запрос, чтобы получить O / P как 2017-08-01 HH:mm:ss.SSS
3 ответа
Чтобы увидеть миллис в выходном значении временной метки, вы можете указать плавающее число в качестве параметра для функции to_timestamp():
0: jdbc:drill:zk=local> SELECT TO_TIMESTAMP(1427936330) FROM (VALUES(1));
+------------------------+
| EXPR$0 |
+------------------------+
| 2015-04-02 00:58:50.0 |
+------------------------+
1 row selected (1.612 seconds)
0: jdbc:drill:zk=local> SELECT TO_TIMESTAMP(1427936330.456) FROM (VALUES(1));
+--------------------------+
| EXPR$0 |
+--------------------------+
| 2015-04-02 00:58:50.456 |
+--------------------------+
Похоже, вы должны использовать substr
на ваших данных, а затем приведите к INT.
Для меня это работает:
test.json: {"отметка времени": 1501580484655 }
0: jdbc:drill:zk=local> select to_timestamp(cast(substr(`timestamp`,
1, 10) as INTEGER)) from dfs.`tmp/test.json`;
+------------------------+
| EXPR$0 |
+------------------------+
| 2017-08-01 02:41:24.0 |
+------------------------+
Это хорошо работает после выбора столбца метки времени из файла записи.
select to_timestamp(cast(CONCAT(substr(`Timestamp`, 1 , 10),'.',substr(`Timestamp`, CHAR_LENGTH(`Timestamp`)-3, 3)) as FLOAT)) from dfs.root.`/test/`;
+--------------------------+
| EXPR$0 |
+--------------------------+
| 2017-08-04 10:00:01.792 |
+--------------------------+