use*_*499 4 cql cassandra cqlsh spring-data-cassandra cassandra-3.0
我在 cassandra 表中存储了时间戳类型列的值,格式为 2018-10-27 11:36:37.950000+0000(GMT 日期)。当我运行下面的查询来获取数据时,我得到Unable to coerce '2018-10-27 11:36:37.950000+0000' to a formatted date (long) 。
select create_date from test_table where create_date='2018-10-27 11:36:37.950000+0000' allow filtering;
Run Code Online (Sandbox Code Playgroud)
如果数据已存储在表中(格式为 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'也尝试过。
是否可以对这种时间戳类型的数据进行过滤呢?
PS 使用 cqlsh 在 cassandra 表上运行查询。
在第一种情况下,问题是您使用微秒指定时间戳,而 Cassandra 使用毫秒进行操作 - 尝试删除最后三位数字 -.950而不是(有关详细信息,.950000请参阅本文档)。时间戳在 Cassandra 中存储为 64 位数字,然后在打印结果时使用datetimeformat选项指定的格式进行格式化cqlshrc(请参阅doc)。没有明确时区的日期将需要在 中指定默认时区cqlshrc。
关于过滤数据的问题 - 此查询仅适用于少量数据,并且在较大数据量上很可能会超时,因为它需要扫描集群中的所有数据。此外,数据将无法正确排序,因为排序仅发生在单个分区内。
如果你想执行这样的查询,那么Spark Cassandra Connector可能会是更好的选择,因为它可以有效地选择所需的数据,然后你可以执行排序等。尽管这将需要更多的资源。
我建议参加DataStax Academy 的DS220课程,了解如何为 Cassandra 进行数据建模。