总而言之,我想创建一个smack架构(spark、mesos、akka、cassandra和kafka)。我想做一个入口点,在这里我可以返回我的数据库中最后50个元素的add。这是我的数据库:
create table fireman
(
uuid uuid primary key,
date text,
heartrate int,
id text,
location text,
ratecommunication int,
temperature int,
time timestamp
);
我试着问这个:
SELECT * FROM scala_fireman.fireman WHERE temperature > 0 ORDER BY date LIMIT 5 ALLOW FILTERING ;
但我有个错误:
ORDER BY is only supported when the partition key is restricted by an EQ or an IN.
所以我的问题是如何选择得到我最后添加的n个元素?
我看到我可以通过这样做来订购table:
) WITH CLUSTERING ORDER BY (time DESC);
但要做到这一点,我需要改变时间作为主键,但一些数据是添加在同一时间,所以我不能设置为主键。
1条答案
按热度按时间6jygbczu1#
由于cassandra需要基于查询的建模方法,因此我们需要专门构建一个表来处理此查询:
你曾经问过吗
uuid
? 如果是这样,那么我们可以建立一个新表。如果没有,您将需要更改主键才能工作。在id列上构建单个主键严重限制了查询的灵活性(正如您所发现的)。这是一个尽可能多的poc,目前我派出了100万消防员
这将是你的第一个障碍。cassandra每个分区只能支持20亿个单元,而且在那之前它会变得很慢。因此,我们要通过“计时”来限制每个分区的消防员事件数
month_bucket
,但您应该确定这是否真的适合您的业务需求。下一步,你想
ORDER BY
日期,所以我们将使用它作为聚类键。实际上,作为date
是一个文本字段,我们将使用time
因为我肯定你不希望结果按ascii字母顺序返回。网上速成教育ORDER BY
条款,是完全多余的。您只能对集群密钥的预定顺序强制执行它。它不应该出现在查询中。注意:出现错误的原因是,排序顺序只能在数据分区内执行。它不能在结果集上强制执行。
另外,我看到你正在对
temperature
. 通常情况下,这是一个坏主意(你需要ALLOW FILTERING
在原始查询中)。但在一个分区内,情况应该不会太糟。只要那个隔板不太大。我们也会集中讨论的。当然,在同一天,同一个温度下,有可能会有多个消防员参与一个事件,所以我们要补充一点
uuid
在最后强制唯一性。您的新主键应该如下所示:因此,如果尝试以下表定义:
现在,如果我加载一些数据并运行您的查询:
通常,我不建议使用
ALLOW FILTERING
. 但只要你在查询分区密钥(month_bucket
)所有数据仍应由同一节点提供服务。另外,我在2015年在cassandra中写了这篇关于结果集排序的文章,并在文章中演示了这些建模技术的使用。四年后它仍然非常相关(特别是对于这样的问题):
我们会有秩序的!
读一读,看看是否有用。