【问题标题】:How to execute multiple queries in a single batch on Cassandra如何在 Cassandra 上批量执行多个查询
【发布时间】:2016-06-28 03:25:39
【问题描述】:

我有一个 Cassandra 表,如下所示:

create table experience.userstats (stream varchar, user varchar, computer varchar, experience varchar, amount int, primary key (experience, stream, user, computer);

我正在使用 Apache 风暴螺栓从队列喷口在 Cassandra 中创建这些记录。

我想生成汇总统计数据并将给定流的不同体验的计数器显示为饼图。例如,30% 的满意、40% 的混合和 30% 的不满意体验。

由于我无法在线更新计数器,我使用 Clock spout(计时器)来读取此数据并将计数器生成到新表中。但是 Cassandra 不支持 group by 子句,因此我必须阅读三次才能获得以下每种体验的计数器。

select count(*) from experience.userstats where experience='satisfied' and stream='xyz';

select count(*) from experience.userstats where experience='unsatisfied' and stream='xyz';

select count(*) from experience.userstats where experience='mixed' and stream='xyz';

这种方法的问题是我必须在数据库上执行三个查询才能获得 3 种经验类型的计数器,同时可以修改经验使这些计数器不一致。

有没有一种方法可以一次执行以上三个 select 语句?或者您能否建议一种替代设计方法?

【问题讨论】:

标签: cassandra apache-storm cassandra-2.1


【解决方案1】:

你可以使用

输入

关系运算符 像这样,

SELECT count(*) FROM userstats WHERE experience IN('mixed','unsatisfied','satisfied) AND stream = 'xyz' ;

【讨论】:

  • 这将计算所有经验。我需要计算每次体验。
【解决方案2】:

执行 count(*) 会让你轻松超时。为什么不使用计数器字段并在插入发生时将其递增?这样,您将只查询一个值。分布式计数器在 2.1 及更高版本中得到了改进,它们运行良好。

【讨论】:

  • 感谢您的提示。我将避免使用 count(*),但我需要根据经验使用计数器,因此可能必须创建新表来维护此计数器。
猜你喜欢
  • 1970-01-01
  • 2014-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-06
  • 2016-06-03
  • 1970-01-01
  • 2019-11-13
相关资源
最近更新 更多