如何为表

时间:2016-12-01 16:59:24

标签: indexing cassandra subquery cqlsh secondary-indexes

我在cassandra中创建了表用户

 create table users (pcId int , userId int, friendId int,  age int, score int , name text, PRIMARY KEY (pcId, userId, friendId, score))

我插入数据:

 INSERT INTO users(pcid , userid , score , friendid ,  age ,  name) Values (1, 1, 2, 1, 12, 'l');
 INSERT INTO users(pcid , userid , score , friendid ,  age ,  name) Values (1, 1, 2, 2, 12, 'a');
 INSERT INTO users(pcid , userid , score , friendid ,  age ,  name) Values (1, 1, 2, 0, 15, 'p');
 INSERT INTO users(pcid , userid , score , friendid ,  age ,  name) Values (1, 2, 6, 1, 15, 'p');
 INSERT INTO users(pcid , userid , score , friendid ,  age ,  name) Values (1, 2, 7, 2, 15, 'p');

pcid | userid | friendid |得分|年龄|名称

1 |      1 |        0 |     2 |  15 |    p
1 |      1 |        1 |     2 |  12 |    l
1 |      1 |        2 |     2 |  12 |    a
1 |      2 |        1 |     6 |  15 |    p
1 |      2 |        2 |     7 |  15 |    p

我的问题是:我如何选择按名称排序的每个用户ID 2朋友(friendid,年龄,姓名,得分)?

我的结果应该是:

pcid | userid | friendid |得分|年龄|名称

1 |      1 |        2 |     2 |  12 |    a
1 |      1 |        1 |     2 |  12 |    l
1 |      2 |        1 |     6 |  15 |    p
1 |      2 |        2 |     7 |  15 |    p

2 个答案:

答案 0 :(得分:1)

如果您使用的是Cassandra 3.6+,则可以在查询中使用PER PARTITION LIMIT 2

SELECT * FROM users PER PARTITION LIMIT 2;

它将按照您的分区中的群集密钥指定的顺序为您提供每个分区的前两行。如果它对您很重要,您可能需要按分区键排序。

这意味着您需要将分区键更改为userid

Here'sSELECT页面的引用。

答案 1 :(得分:0)

您可以使用实体化视图
 它是在cassandra 3.0中引入的

  

在Cassandra 3.0及更高版本中,物化视图是一个表,它是根据另一个表的数据构建的,具有新的主键和新属性。在Cassandra中,查询通过主键定义进行优化。标准做法是为查询创建表,如果需要不同的查询,则创建新表。在Cassandra 3.0之前,必须在客户端应用程序中手动更新这些附加表。物化视图会自动从其源表中接收更新。

创建像这样的物化视图。

CREATE MATERIALIZED VIEW users_friend AS
    SELECT *
    FROM test.users
    WHERE name IS NOT NULL AND 
    pcid IS NOT NULL AND 
    userid IS NOT NULL AND
    friendid IS NOT NULL AND 
    score IS NOT NULL
    PRIMARY KEY (pcid, userid, name, friendid, score)
    WITH CLUSTERING ORDER BY (userid ASC, name ASC, friendid ASC, score ASC)

现在,如果您在users表上插入数据,cassandra会将数据复制到users_friend
现在,如果您希望朋友列表按名称使用下面的查询:

SELECT * FROM users_friend WHERE pcid = 1 and userid = 1

您将获得以下输出:

 pcid | userid | name | friendid | score | age
------+--------+------+----------+-------+-----
    1 |      1 |    a |        2 |     2 |  12
    1 |      1 |    l |        1 |     2 |  12
    1 |      1 |    p |        0 |     2 |  15

如果更新userid = 1,则friendid = 2 name

UPDATE users SET name = 'm' WHERE pcid = 1 AND userid = 1 and friendid = 2 and score = 2

你会得到

 pcid | userid | name | friendid | score | age
------+--------+------+----------+-------+-----
    1 |      1 |    l |        1 |     2 |  12
    1 |      1 |    m |        2 |     2 |  12
    1 |      1 |    p |        0 |     2 |  15

来源:https://docs.datastax.com/en/cql/3.3/cql/cql_using/useCreateMV.html
更多:https://cassandra-zone.com/materialized-views/