Использование 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  |
+--------------------------+
Другие вопросы по тегам