我正在使用Cassandra 1.2.7和使用CQL3的官方Java驱动程序 .
假设由一个表创建
CREATE TABLE foo (
row int,
column int,
txt text,
PRIMARY KEY (row, column)
);
然后我想预制相当于 SELECT DISTINCT row FROM foo
至于我的理解,应该可以在Cassandra的数据模型中有效地执行这个查询(给定复合主键的实现方式),因为它只是查询'raw'表 .
我搜索了CQL文档但我没有找到任何选项来做到这一点 .
我的备份计划是创建一个单独的表 - 类似于
CREATE TABLE foo_rows (
row int,
PRIMARY KEY (row)
);
但这需要让两者保持同步的麻烦 - 写入foo_rows用于foo中的任何写入(也是性能损失) .
那么有没有办法查询不同的行(分区)键?
3 回答
根据documentation,从CQL版本3.11开始,cassandra了解DISTINCT修饰符 . 所以你现在可以写了
我先给你一个不好的方法 . 如果您插入这些行:
做一个
会给你以下内容:
不明显,因为它显示了行和列的所有可能组合 . 要查询以获取一行值,可以添加列值:
但是你会得到这个警告:
好 . 然后用这个:
大 . 我想要的 . 我们不要忽视那个警告 . 如果你只有少量行,比如说10000,那么这将在没有大幅提升性能的情况下发挥作用 . 如果我有10亿呢?根据节点数量和复制因素,您的性能将受到严重影响 . 首先,查询必须扫描表中的每个可能的行(读取全表扫描),然后筛选结果集的唯一值 . 在某些情况下,此查询将超时 . 鉴于此,可能不是你想要的 .
您提到您担心插入多个表时性能受到影响 . 多表插入是一种非常有效的数据建模技术 . Cassandra 可以做大量的写作 . 至于同步的痛苦,我不知道你的确切应用,但我可以给出一般提示 .
如果需要进行不同的扫描,则需要考虑分区列 . 这就是我们所说的索引或查询表 . 在任何Cassandra数据模型中要考虑的重要事项是应用程序查询 . 如果我使用IP地址作为行,我可能会创建这样的东西来扫描我依次拥有的所有IP地址 .
现在,要在我的192.x.x.x地址空间中插入一些行:
为了获得192空间中的不同行,我这样做:
要获取每个地址,您只需要迭代0-255中的每个可能的行键 . 在我的例子中,我希望应用程序要求特定的范围来保持高性能 . 您的应用程序可能有不同的需求,但希望您可以在此处查看模式 .
@edofic
分区行键用作唯一索引以区分存储引擎中的不同行,因此本质上,行键始终是不同的 . 您不需要在SELECT子句中放入DISTINCT
例
然后
将返回2个值:1和2
以下是Cassandra的持续性
|行键| column1 / value | column2 / value |
| 1 | 1 / '1' | 2 / '2' |
| 2 | 1 / '1' | |