在查找时间序列数据时,Cassandra会返回变量结果

时间:2016-12-06 02:16:33

标签: cassandra datastax cql3 datastax-java-driver

当我在DataStax DevCenter中提供此查询时,将返回2行。返回的行是12月30日那个应该是的。

SELECT * FROM abc.alerts_by_type_and_timestamp WHERE alert_type IN ('Permanent Fault', 'Temporary Fault') AND alert_timeStamp >= '2015-12-30T15:00+0000' AND alert_timeStamp <= '2015-12-31T15:00+0000'

但是像这样在PreparedStatement中运行

    SELECT * FROM abc.alerts_by_type_and_timestamp WHERE alert_type IN :alertTypes AND alert_timeStamp >= :minTimestamp AND alert_timeStamp <= :maxTimestamp

返回4行以下。

    17:52:48,587 INFO  [stdout] (default task-39) minTimestamp: 2015-12-30 15:00:00.0 - maxTimestamp : 2015-12-31 15:00:00.0
    17:52:50,904 INFO  [stdout] (default task-39) row : Row[Permanent Fault, Thu Dec 31 12:09:22 PST 2015, 2015, 365, .....]
    17:52:50,904 INFO  [stdout] (default task-39) row : Row[Permanent Fault, Thu Dec 31 12:08:14 PST 2015, 2015, 365, ....]
    17:52:50,905 INFO  [stdout] (default task-39) row : Row[Temporary Fault, Thu Dec 31 12:09:22 PST 2015, 2015, 365, ...]
    17:52:50,906 INFO  [stdout] (default task-39) row : Row[Temporary Fault, Thu Dec 31 12:08:14 PST 2015, 2015, 365, ...]

    17:52:50,906 INFO  [stdout] (default task-39) count is : 4

我认为这是由于时间转换造成的。数据存储为GMT,但不知何故,PreparedStatement将其传递给PST ??

如何解决此问题?

我也试过这个:

DateTime dateTime = new DateTime(minTimestamp.getTime(), DateTimeZone.UTC);
DateTime dateTime2 = new DateTime(maxTimestamp.getTime(), DateTimeZone.UTC);
BoundStatement stmtByAlertTypeAndTimestamp = pStmt.bind()
    .setTimestamp("minTimestamp", new Timestamp(dateTime.getMillis()))
    .setTimestamp("maxTimestamp", new Timestamp(dateTime2.getMillis()))
    .setList("Types", Types);

在日期时间打印时间:

 minTimestamp: 2016-07-19 17:00:00.0  
 maxTimestamp: 2016-07-26 00:00:00.0

由于

1 个答案:

答案 0 :(得分:0)

您应该更改文件 $ CASSANDRA_HOME / pylib / cqlshlib / formatter.py

将函数strftime更改为

def strftime(time_format, seconds):
    tzless_dt = datetime_from_timestamp(seconds)
    return tzless_dt.replace(tzinfo=pytz.utc).astimezone(pytz.timezone('Asia/Kolkata')).strftime(time_format)

并导入pytz库

我这样做是为了将cqlsh输出更改为IST。您可以根据需要更改时区

说明:实际上cassandra始终将数据存储在GMT中,并且准备好的语句在本地时区(系统时区)中占用时间,因此您的结果在两个查询中都不同。

还有一项工作可以在准备好的语句中传递数据时间和时区,然后据我说它应该可以正常工作

希望有所帮助