我有一个有大约15个字段的大Cassandra表,我想创建许多物化视图来支持我的所有查询。基表上的主键是(CompanyName,ctime),其中ctime是timeuuid。该表记录了在某个时间戳上对某个公司网站的每一次点击。
例如,我的一个查询包括搜索在特定时间范围内(最大一年)使用最多的浏览器。
CREATE MATERIALIZED VIEW clicks_by_browser
AS SELECT CompanyName, ctime, browsername
FROM companyclicks
WHERE CompanyName is not null AND ctime is not null AND browsername is not null
PRIMARY KEY(CompanyName, ctime, browsername)
SELECT browsername, count(*) from clicks_by_browser
WHERE CompanyName='example' and id>=minTimeuuid(...)
GROUP BY browsername;
Cassandra拒绝它,因为“Group by只支持遵循主键中声明顺序的列组”。所以问题是我在主键中的browsername之前声明了ctime。
所以我试着把它们的顺序颠倒成聚类列,
CREATE MATERIALIZED VIEW clicks_by_browser
AS SELECT CompanyName, ctime, browsername
FROM companyclicks
WHERE CompanyName is not null AND ctime is not null AND browsername is not null
PRIMARY KEY(CompanyName, browsername, ctime)
但是现在Cassandra拒绝了相同的查询,因为在WHERE子句中不能限制ctime,因为前面的browsername列不受限制。
那么,这样的查询目前在Cassandra中是不可能的吗?还是我漏掉了一些明显的东西?
TLDR:这是不可能的。
长回答:
根据Cassandra JIRA,Cassandra目前不在任意列上实现group by。按多列分组时,只能按主键列在主键中声明的顺序(从第一列开始)按主键列分组。
唯一允许的例外情况是使用相等限制限制了前n列。注意,用“=”限制列就是选择一个组,所以该列中没有任何要分组的内容,这就是为什么Cassandra允许这样做。然后,您可以按照顺序并从下一列开始按剩余列分组(不能跳过中间的列)。
因此,要按列分组,前面的所有主键列都必须受“=”限制,或者在group by子句中。
上面的范围查询失败,因为示例列受到范围的限制,因此仍然有多个组,但不在group by子句中。LIKE和IN限制在这种情况下也不起作用。
我认为最好的办法是在group by中包含timeuuid,然后在应用程序中进行聚合。
SELECT browsername,id, count(*) from clicks_by_browser
WHERE CompanyName='example' and id>=minTimeuuid(...)
GROUP BY id,browsername;
在你否决之前,我想声明,我看了所有类似的问题,但我仍然得到可怕的“主键列不能被限制”错误。 下面是我的表结构: 谢谢,德尼兹
我们运行的cassandra集群有3个节点,复制因子为2。 我们的nodejs服务器是查询这个集群的唯一地方。 是否有其他任何地方的参数设置可能导致不一致的查询? cassandra v2.2.4 nodejs驱动程序v3.0.0 编辑-添加我正在做的事情的示例: 1)检查用户名是否被占用 2)创建用户
我正在尝试评估Cassandra DB在存储和检索不同通道的时间序列数据方面的性能。 数据以文件格式记录,最大记录速率为8个样本/秒,每个样本都有一个以毫秒为单位的时间戳。给定时间记录的通道数可能会有所不同。 受以下链接的启发,我使用时间序列数据建模入门创建了以下表: 创建表uhhdata ( ch_idx int,date timestamp,dt timestamp,val float,PRI
我用Spring Data Cassandra 2.2.1开发了一个新的应用程序,想在Cassandra 2.1.9服务器上运行它(旧的,我知道)。但是我们得到了错误 Spring数据卡桑德拉手册声称Spring数据2.2.1至少需要卡桑德拉2.1,所以这应该有效,但它没有。我们包含的唯一特定于卡桑德拉的依赖项是 我怎样才能让这个工作?
如何根据用户定义的类型字段筛选cassandra查询?我想在我的cassandra数据库中创建人员表,所以我在我的cassandra中创建了这个用户定义的类型。 我也有这张桌子。 我需要过滤我的查询,以了解所有姓氏jolie的人。我如何从这个表中查询这个。在cassandra中过滤和查询的情况如何?我知道我可以删除全名类型并将名字和姓氏添加到主表中,但这是我想要做的一个示例。我必须有全名类型。
我在做一个分布式数据库。我试图生成一个唯一的ID,它将作为Cassandra中的列族主键。 我想知道是否有一种方法可以根据时间生成一个唯一的ID?