【问题标题】:Apache Phoenix CURRENT_TIME() gives NPEApache Phoenix CURRENT_TIME() 提供 NPE
【发布时间】:2017-05-24 06:45:57
【问题描述】:

我正在尝试在时间戳列上使用 Apache Phoenix 的过滤器。

我的表和列存在。该列的类型为 TIMESTAMP。 https://phoenix.apache.org/language/datatypes.html#timestamp_type

0: jdbc:phoenix:localhost:2181:/hbase> SELECT * FROM METRIC where METRIC_ID = 'process.cpu' AND METRIC_TIMESTAMP > NOW();
java.lang.NullPointerException
at org.apache.phoenix.compile.ScanRanges.getAscTimeRange(ScanRanges.java:674)

我也尝试过使用 CURRENT_TIME()

0: jdbc:phoenix:localhost:2181:/hbase> SELECT * FROM METRIC where METRIC_ID = 'process.cpu' AND METRIC_TIMESTAMP > CURRENT_TIME();
java.lang.NullPointerException
at org.apache.phoenix.compile.ScanRanges.getAscTimeRange(ScanRanges.java:674)
at org.apache.phoenix.compile.ScanRanges.getRowTimestampColumnRange(ScanRanges.java:658)

【问题讨论】:

    标签: hbase phoenix


    【解决方案1】:

    这是一个错误 - 请提交 JIRA。一种解决方法是将 METRIC_TIMESTAMP 声明为 DATE 而不是 TIMESTAMP。 Phoenix 中的 DATE 类型的粒度为毫秒。

    【讨论】:

    • 会的。我对自动生成的时间戳也有类似的问题。
    • 为了解决问题,我应该使用将类型映射到 sql.Date 吗?这将保持粒度到毫秒吗?
    • 在您的创建表语句中,将 METRIC_TIMESTAMP 声明为 DATE 类型:CREATE TABLE METRIC (...., METRIC_TIMESTAMP DATE)。 Phoenix 使用 8 字节的 epoch 长来存储日期,因此它始终以毫秒为粒度。确保使用显示完整粒度的 SQL 客户端 - 例如,sqlline 仅显示 DATE 的日期部分。您可以使用 SELECT TO_CHAR(METRIC_TIMESTAMP, 'yyyy MM dd HH:mm:ss.SSS') FROM METRIC;
    猜你喜欢
    • 1970-01-01
    • 2016-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多