计算cassandra

时间:2017-10-25 08:56:12

标签: cassandra datastax cql

我有一张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;

它给出了表的总行数。有人可以帮忙吗?

4 个答案:

答案 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中对此进行了测试。我不知道为什么其他人都说这是不可能的。