div*_*poc 2 java cassandra datastax-java-driver
我正在使用Cassandra 2.1.2和相应的DataStax Java驱动程序以及DataStax提供的Object映射.
下表定义:
CREATE TABLE IF NOT EXISTS ses.tim (id text PRIMARY KEY, start bigint, cid int);
Run Code Online (Sandbox Code Playgroud)
映射:
@Table(keyspace = "ses", name = "tim")
class MyObj {
@PartitionKey
private String id;
private Long start;
private int cid;
}
Run Code Online (Sandbox Code Playgroud)
访问者
@Accessor
interface MyAccessor {
@Query("SELECT * FROM ses.tim WHERE id = :iid")
MyObj get(@Param("iid") String id);
@Query(SELECT * FROM ses.tim WHERE start <= :sstart")
Result<MyObj> get(@Param("sstart") long start);
}
Run Code Online (Sandbox Code Playgroud)
如访问者中所示,我想做一个返回"start"小于或等于特定值的所有内容的查询.
有了这个表的定义,根本不可能.因此我尝试创建二级索引:
CREATE INDEX IF NOT EXISTS myindex ON ses.tim (start);
Run Code Online (Sandbox Code Playgroud)
这看起来似乎没有用(我读了很多解释为什么它决定不支持这个,但我仍然不明白为什么有人会给出这样的限制,无论如何..)
所以,据我所知,我们必须在WHERE子句中至少有一个等号
@Query(SELECT * FROM ses.tim WHERE cid = :ccid AND start <= :sstart")
CREATE INDEX IF NOT EXISTS myindex2 ON ses.tim (cid);
Run Code Online (Sandbox Code Playgroud)
如果这可行,我将不得不知道cid的所有可能值,并分别查询它们并在客户端上完成其余的...但我得到的错误是
Cannot execute this query as it might involve data filtering and thus may have unpredictable performance
Run Code Online (Sandbox Code Playgroud)
然后我试了
id text, start bigint, cid int, PRIMARY KEY (id, start, cid)
Run Code Online (Sandbox Code Playgroud)
同
@Table(keyspace = "ses", name = "tim")
class MyObj {
@PartitionKey
private String id;
@ClusteringColumn(0)
private Long start;
@ClusteringColumn(1)
private int cid;
}
Run Code Online (Sandbox Code Playgroud)
但仍然没有运气.
此外,我尝试将'start'设置为PartitionKey,但只能再次使用Equals进行查询...
我错过了什么?如何获得此类查询的结果?
编辑:版本更新,以纠正一个
如果对同一组数据有不同的查询能力需求,则可以考虑对数据进行非规范化.根据您的问题,听起来您需要以下内容:
id
start
<X 查询当您使用当前架构指示时,第一个查询正常工作.然而,第二个查询无法正常工作,因为没有二级索引,因为您已经调查过的原因会很慢(我总是指向关于二级索引的博客文章).
您表示您不想分区,cid
因为您需要知道所有可能的值cid
.
我能想到的三个想法:
使用虚拟主键创建单独的表,以便将所有数据存储在同一分区中.如果您有许多条目在任何保存该数据的节点上创建超宽分区和热点,则这可能会有问题.你有多少计划?
create table if not exists tim (
dummy int,
start bigint,
id text,
cid int,
primary key (dummy, start)
);
Run Code Online (Sandbox Code Playgroud)
然后你可以进行如下查询:
select * from tim where dummy=0 and start <= 10;
Run Code Online (Sandbox Code Playgroud)另一种选择是在原始表上使用ALLOW FILTERING,它仍然会进行昂贵的范围查询并过滤数据.
select * from tim where start <= 10 ALLOW FILTERING;
Run Code Online (Sandbox Code Playgroud)另一种选择是使用类似spark-connector的东西来创建一个生成查询的spark作业.连接器将昂贵的范围查询分解为较小的任务并将数据映射到RDD,从而允许您灵活地进行具有良好性能的更复杂查询.
归档时间: |
|
查看次数: |
1007 次 |
最近记录: |