Cassandra按非聚类键对结果进行排序

Cassandra按非聚类键对结果进行排序,cassandra,datastax,cassandra-3.0,Cassandra,Datastax,Cassandra 3.0,我们使用Cassandra的用例是显示博客帖子的前10名访问者。下面是Cassandra表的定义 CREATE TABLE blogs_by_visitor ( blogposturl text, visitor text, visited_ts timestamp, PRIMARY KEY (blogposturl, visitor) ); 现在,为了显示给定博客文章

我们使用Cassandra的用例是显示博客帖子的前10名访问者。下面是Cassandra表的定义

CREATE TABLE blogs_by_visitor (
             blogposturl text,
             visitor text,
             visited_ts timestamp,
             PRIMARY KEY (blogposturl, visitor)
           );
现在,为了显示给定博客文章的前10名最近访客,需要在timestamp desc上有一个明确的“order by”子句。因为visted_ts不是Cassandra中集群列的一部分,所以我们无法完成这项工作。访问量不属于群集列的原因是为了避免记录重复(读作重复)的访问者。主键的设计方式可以为重复访问的用户向上插入最新的时间戳

在RDBMS世界中,查询如下所示,可以使用blogpostrl和timestamp列创建二级索引

Select visitor from blog_table
where 
blogposturl = ?
and rownum <= 10
order by timestamp desc
从blog_表中选择访问者
哪里
blogpostrl=?

和rownum这些类型的工作是由apachespark或Hadoop完成的。一种调度作业,它根据每个url的时间戳计算唯一的访问者顺序,并将结果存储到cassandra中

或者,您可以在
博客的顶部创建一个由访问者创建的博客。此表将确保唯一的访问者,具体化视图将根据
visted\u ts
timestamp对结果进行排序

让我们创建物化视图:

CREATE MATERIALIZED VIEW unique_visitor AS
    SELECT *
    FROM blogs_by_visitor
    WHERE blogposturl IS NOT NULL AND visitor IS NOT NULL AND visited_ts IS NOT NULL
    PRIMARY KEY (blogposturl, visited_ts, visitor)
    WITH CLUSTERING ORDER BY (visited_ts DESC, visitor ASC);
现在你可以选择最近10个博客的唯一访问者

SELECT * FROM unique_visitor WHERE blogposturl = ? LIMIT 10;
您可以看到,我没有在select查询中指定排序顺序。因为在物化视图模式中,a指定了默认排序顺序
visitored\u ts DESC

请注意:上述模式将在物化视图中产生大量意外的墓碑生成

或者您可以更改您的表格schmea,如下所示:

CREATE TABLE blogs_by_visitor (
     blogposturl text,
     year int,
     month int,
     day int,
     visitor text,
     visited_ts timestamp,
     PRIMARY KEY ((blogposturl, year, month, day), visitor)
);

现在,单个分区中只有少量数据。因此,您可以根据客户端在该分区中访问的
对所有访问者进行排序。如果您认为一天中的访问者数量可能很大,那么也可以在分区键中添加小时。

这种物化视图的问题是,它会导致每个重复访问者都被删除。尤其是使用机器人时,每个博客可能会有数十万的重复访客,从而在您描述的物化视图中形成许多墓碑。所以select查询最终会扫描这些墓碑并失败。正如我提到的,这些类型的工作是由ApacheSpark或Hadoop完成的。一个调度作业,它根据每个url的时间戳计算唯一的访问者顺序,并将结果存储到cassandra中。建议的模式甚至不满足原始用例。现在我怎么知道我要回去多久才能把最后10个访客接回来呢。对于所请求的用例来说,这是一个糟糕的设计。有时候会有访客,有时候不会有。因此,你必须不断猜测,并导致太多零星阅读。此外,重复访问者的情况也不能再被跟踪,因为他们一直按天/小时进入自己的分区。@dilsingi您可以从分区中删除这一天。然后你可以对一个月的所有访客进行排序。但想想现实,如果你想在卡桑德拉做到这一点,没有其他办法。