【问题标题】:cassandra paging and hash numberscassandra 分页和哈希数
【发布时间】:2013-10-21 15:14:21
【问题描述】:

我想像这样在 cassandra 中使用切片查询:

create table users (KEY varchar PRIMARY KEY, data varchar);
insert into users (KEY, 'data') values ('1', 'one');
insert into users (KEY, 'data') values ('2', 'two');
insert into users (KEY, 'data') values ('3', 'three');
insert into users (KEY, 'data') values ('4', 'four');
select * from users;
  3 | three
  2 |   two
  1 |   one
  4 |  four
select * from users LIMIT 1;
  3 | three
select * from users WHERE KEY > '3' LIMIT 1;
  2 |  two
select * from users WHERE KEY > '2' LIMIT 1;
  1 |  one
select * from users WHERE KEY > '1' LIMIT 1;
  4 | four

在这个例子中,分区器是有序的。但我的分区器是无序的。所以我使用这样的查询:

select * from users WHERE token(KEY) > token('3') LIMIT 3;

如果我想访问所有行,我必须从具有最低哈希数的键开始查询。 有没有办法找到具有最低哈希数的密钥?如果没有,是否有更好的方法来分页表格行?

感谢您的帮助:)

编辑:

现在我有另一个问题。token 函数仅支持分区键。在我的 cf 中,主键复合为 (word,docid)。所以例如我有严重的 word=hi.and 当我使用像 select 这样的查询时* 来自用户 WHERE token(word) > token('hi') LIMIT 3;它从我的 cf 中的最后一个 hi 开始,这样一些 word=hi 的行被忽略了。

【问题讨论】:

    标签: hash cassandra paging


    【解决方案1】:

    您的第一个查询不能有WHERE,它将返回按哈希排序的第一个键。然后,您可以在下一个查询中使用该返回的最后一个键。

    您也可以使用token(''),它的计算结果是最低的令牌,即

    select * from users WHERE token(KEY) > token('') LIMIT 3;
    

    将返回按token排序的前3个键,相当于

    select * from users LIMIT 3;
    

    您还可以使用 Cassandra 2.0 中新的自动分页(请参阅CASSANDRA-4415)。

    【讨论】:

    • 感谢您的帮助。但现在我有另一个问题。仅分区键支持令牌功能。在我的 cf 中,主键复合为(word,docid)。所以例如我有严重的 word=hi。当我使用 select * from 之类的查询时users WHERE token(word) > token('hi') LIMIT 3;它从我的 cf 中的最后一个 hi 开始,这样一些 word=hi 的行被忽略了。
    • 您可以在行内进行限制,但听起来 Cassandra 2.0 中的自动分页会满足您的需求。
    • 你能详细解释一下 Cassandra 中的自动分页吗?
    • 您可以运行select * from users; 并阅读结果。它在后台为您分页结果,因此您无需将所有结果存储在内存中,您可以在结果还在出现时开始处理。
    • 它是自动的!但是你需要 Cassandra 2.0。
    猜你喜欢
    • 1970-01-01
    • 2011-08-20
    • 1970-01-01
    • 2012-02-14
    • 2013-11-25
    • 2019-05-02
    • 2019-04-04
    • 1970-01-01
    相关资源
    最近更新 更多