范围查询如何在Cassandra中工作?

时间:2018-04-21 14:57:38

标签: cassandra

查询我想解雇

select * from t1 where c1 > 1000 and c2 > 1Million and c3 > 8Million

表t1的数据模型

create table t1 {
    c1 int,
    c2 int,
    c3 int,
    c4 text
}

我应该将哪些列用作分区键,哪些列用作群集键。 c1,c2,c3的值可以在1到10百万之间。

如果我执行主键((c1,c2,c3)),则值将在群集中传播。但是当我开火>对c1,c2,c3列的查询Cassandra如何知道要联系哪些节点或者进行完整的分片扫描?

2 个答案:

答案 0 :(得分:1)

它不允许您在没有ALLOW FILTERING的情况下进行查询,这使得它可以读取整个数据集,因为它遍及整个群集。它会读取所有东西,丢弃不匹配的东西。强烈建议永远不要在开发/测试之外使用var groupUpdate = function(id, callback) { return firebase.database().ref('groups/').child(id).on('child_changed', (snapshot) => { callback({key: snapshot.key, value: snapshot.val()}); }); }; module.exports = { groupUpdate: groupUpdate } ,除非确定你在做什么。

答案 1 :(得分:0)

分区键只能用等号过滤,而不能用你所拥有的不等号过滤。不等式只能与聚类键一起使用。

如果您的表没有那么多行,您可以使用存储桶策略。使用它,您可以创建一个辅助列作为唯一具有预定义值的分区键(例如1)。

create table t1 {
    bucket int,
    c1 int,
    c2 int,
    c3 int,
    c4 text,
    PRIMARY KEY (bucket, c1, c2, c3)
}

因为您有一个分区,所以它不足以扩展包含许多行的表。

如果你有很多行需要分区,那么你必须重新考虑你的策略,并考虑:

  • 在数据中查找能够对数据进行分区的某种键(或键),同时在需要时帮助对其进行过滤。然后,您将在上面的示例中将其用作分区键。也许对数据进行非规范化可以帮助实现该密钥(例如:创建一个名为Status for Low / Medium / High数字的列,您可以在以后的群集密钥的不等式过滤中更好地过滤)。

  • 规划要由分析框架(如Spark)查询的表格。在分析中,通常需要按任何列进行查询,具有等同性或不等式。