TO_DATE 在 Apache Drill 中用于将 UNIX TIMESTAMP 转换为人类可读的时间格式

TO_DATE usage in Apache Drill to convert UNIXTIMESTAMP to human readable time format

我的 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 文件对我的上传时间戳列进行查询时,我得到:

5a - 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

的正确查询应该是什么

看来您应该对数据使用 substr,然后转换为 INT。

对我来说它有效:

test.json: { "timestamp": 1501580484655 }

0: jdbc:drill:zk=local> select to_timestamp(cast(substr(`timestamp`, 
1, 10) as INTEGER)) from dfs.`tmp/test.json`;
+------------------------+
|         EXPR[=10=]         |
+------------------------+
| 2017-08-01 02:41:24.0  |
+------------------------+

要在输出时间戳值中查看毫秒,您可以将浮点数指定为 to_timestamp() 函数的参数:

0: jdbc:drill:zk=local> SELECT TO_TIMESTAMP(1427936330) FROM (VALUES(1));
+------------------------+
|         EXPR[=10=]         |
+------------------------+
| 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[=10=]          |
+--------------------------+
| 2015-04-02 00:58:50.456  |
+--------------------------+

这在从记录文件中选取时间戳列后效果很好。

 select to_timestamp(cast(CONCAT(substr(`Timestamp`, 1 , 10),'.',substr(`Timestamp`, CHAR_LENGTH(`Timestamp`)-3, 3)) as FLOAT)) from dfs.root.`/test/`;

+--------------------------+
|          EXPR[=10=]          |
+--------------------------+
| 2017-08-04 10:00:01.792  |
+--------------------------+