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 |
+--------------------------+
我的 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 |
+--------------------------+