我有一个很大的cassandra表,其中包含大约15个字段,我想创建许多物化视图来支持我的所有查询。基表上的主键是(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拒绝了它,因为“groupby只支持按主键中声明的顺序排列的列组”。所以问题是我在主键中的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是不可能的吗?还是我遗漏了什么?
1条答案
按热度按时间1sbrub3j1#
tldr:这是不可能的。
长话短说:
根据cassandrajira的说法,cassandra目前没有在任意列上实现groupby。按多列分组时,只能按主键列在主键中声明的顺序(从第一列开始)进行分组。
唯一允许的例外是,如果您使用相等限制限制了前n列。请注意,用“=”限制列就是选择一个组,因此该列中没有要分组的内容,这就是为什么cassandra允许这样做。然后,您可以按其余列进行分组,按顺序并从下一列开始(不能跳过中间的列)。
因此,要按列分组,所有前面的主键列必须由“=”限制或位于GROUPBY子句中。
类似上面的range查询失败,因为sample列被range限制,因此仍然有多个组,但不在groupby子句中。在这种情况下,like和in限制也不起作用。
我认为您可以尝试的最好方法是将timeuuid包含在group by中,然后在应用程序中进行聚合。