2017-05-23 34 views
0

我试图在时间戳列上使用Apache Phoenix的过滤器。Apache Phoenix CURRENT_TIME()给出NPE

我的表格和列存在。该列是类型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) 

回答

0

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

+0

会做。我对自动生成的时间戳有类似的问题。 – bearrito

+0

为了解决这个问题,我应该使用map到sql.Date类型吗?这会保持毫米的粒度吗? – bearrito

+0

在您的create table语句中,将METRIC_TIMESTAMP声明为DATE类型:CREATE TABLE METRIC(....,METRIC_TIMESTAMP DATE)。 Phoenix使用8个字节的纪元来存储日期,所以它始终处于毫秒级的粒度。确保使用显示完整粒度的SQL客户端 - 例如,sqlline仅显示DATE的白天部分。您可以使用SELECT TO_CHAR(METRIC_TIMESTAMP,'yyyy MM dd HH:mm:ss.SSS')FROM METRIC; –