我在cassandra表中存储了时间戳类型列的值,格式为 2018-10-27 11:36:37.950000 + 0000(GMT日期)。 当我在查询下运行以获取数据时,我无法将'2018-10-27 11:36:37.950000 + 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:37.950000 + 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'
也是如此。
是否可以对这种时间戳类型的数据执行过滤?
P.S。使用cqlsh在cassandra表上运行查询。
答案 0 :(得分:1)
在第一种情况下,问题在于您以毫秒为单位指定时间戳,而Cassandra以毫秒为单位-尝试删除最后三个数字-.950
而不是.950000
(请参阅此{{3} })。时间戳记以64位数字的形式存储在Cassandra中,然后在打印结果时使用datetimeformat
的{{1}}选项指定的格式进行格式化(请参阅document)。没有明确时区的日期将要求在cqlshrc
中指定默认时区。
关于过滤数据的问题-该查询仅适用于少量数据,而对于较大的数据,此查询很可能会超时,因为它将需要扫描集群中的所有数据。另外,数据将无法正确排序,因为排序仅发生在单个分区内。
如果您想执行此类查询,则Spark Cassandra Connector可能是更好的选择,因为它可以有效地选择所需的数据,然后可以执行排序等。尽管这将需要更多的资源。
我建议从DataStax学院学习doc课程,以了解如何为Cassandra建模数据。
答案 1 :(得分:0)
这对我有用
var datetime = DateTime.UtcNow.ToString("yyyy-MM-dd HH:MM:ss");
var query = $"SET updatedat = '{datetime}' WHERE ...