我将时间戳类型列的值存储在cassandra表中,格式为2018-10-27 11:36:37950000+0000(GMT日期(。当我运行以下查询以获取数据时,我无法将"2018-10-27 11:36:37950000+0000"强制为格式化日期(长(。
select create_date from test_table where create_date='2018-10-27 11:36:37.950000+0000' allow filtering;
如果数据已经存储在表中(格式为2018-10-27 11:36:37950000+0000(,如何使查询工作,并对create_date列执行范围(>=或<=(操作?
我试过create_date='2018-10-27 11:36:37.95Z',
create_date='2018-10-27 11:36:37.95'
和create_date='2018-10-27 11:36:37.95'
。
是否可以对这种时间戳类型的数据进行筛选?
附言:使用cqlsh在cassandra表上运行查询。
在第一种情况下,问题是您用微秒指定时间戳,而Cassandra用毫秒操作-尝试删除最后三个数字-.950
而不是.950000
(有关详细信息,请参阅本文档(。时间戳以64位数字的形式存储在Cassandra中,然后在打印结果时使用cqlshrc
的datetimeformat
选项指定的格式进行格式化(请参阅文档(。没有明确时区的日期将要求在cqlshrc
中指定默认时区。
关于您关于筛选数据的问题,此查询仅适用于少量数据,对于较大的数据大小,很可能会超时,因为它需要扫描集群中的所有数据。此外,数据也不会被正确排序,因为排序只在单个分区内进行。
如果你想执行这样的查询,那么Spark Cassandra连接器可能是更好的选择,因为它可以有效地选择所需的数据,然后你可以执行排序等。尽管这需要更多的资源。
我建议参加DataStax Academy的DS220课程,了解如何为Cassandra建模数据。
这适用于我的
var datetime = DateTime.UtcNow.ToString("yyyy-MM-dd HH:MM:ss");
var query = $"SET updatedat = '{datetime}' WHERE ...