我有一张cassandra表订阅,其中包含以下列:
firmId, //partition key
acct_info,
appId,
can
firmId是分区键。没有集群密钥。
字段 appId 可以包含以下三个值之一:
appId1, appId2, appId3
我想要每个appId值的行数。示例:appId1的行数,appId2的行数和appId3的行数。
我试过
select COUNT(*) from subscription;
select COUNT(appId) from subscription;
它给出了表的总行数。有人可以帮忙吗?
答案 0 :(得分:-1)
无法使用CQL查询。
您正在寻找cassandra中<{1>} NOT Posible 之类的内容。
尝试使用spark-cassandra-connector获取现有记录的数量,并使用SELECT appId,COUNT(appId) FROM subscription GROUP BY appId
创建一个单独的表,您可以在其中维护计数(在插入和删除期间更新值)
答案 1 :(得分:-1)
您无法使用当前数据模型进行查询。
在Cassandra中,数据是根据您的查询建模的
因此,您应该以这种方式对数据建模,以便您可以像这样查询。
例如,创建一个如下所示的新表:
CREATE TABLE appIdCounter(
appId text PRIMARY KEY,
count counter
);
因此,每当出现一个新的appId值时,count的值就会增加一个。
UPDATE appIdCounter SET count = count + 1 WHERE appId = ?;
现在,您只需选择查询即可轻松获取每个appID的计数
SELECT * FROM appIdCounter ;
答案 2 :(得分:-1)
正如所有其他人所说:这不可能以这种简单的方式进行,也许您最好使用SQL数据库。
Ashraful关于计数器的答案非常好,除非您对数据有TTL,因为在这种情况下计数器不会自动递减。
还有另一种方法,可能会或可能不会帮助您,但这需要appId成为一个群集键,它会更改数据模型的语义。如果是:您可以创建一个物化视图,基本上转置您的数据模型,并使appId成为主要,而firmId是次要密钥。另一方面,这有一些不同的反向:对视图的写入速度相当慢,因此如果您有大量写入工作负载,请不要使用视图。此外,由于您的appId(视图中的行键)只能获取3个值,因此基本上只生成3行,您将无法在群集中获得良好的分布。
免责声明:我从未在制作过程中使用过物化视图。
答案 3 :(得分:-1)
您可以使用以下CQL语句获取相应的计数:
select count(*) from subscription WHERE appid = 'appId1' ALLOW FILTERING ;
select count(*) from subscription WHERE appid = 'appId2' ALLOW FILTERING ;
select count(*) from subscription WHERE appid = 'appId3' ALLOW FILTERING ;
我在Cassandra 3.11.2中对此进行了测试。我不知道为什么其他人都说这是不可能的。