如何从某些键空间中选择计数(不同的某些列).在卡桑德拉



我需要从我的Cassandra数据库中获取一个唯一的客户端ID计数。 我知道我无法通过以下一段 CQL 代码完成此操作:

SELECT COUNT(DISTINCT clientid)
FROM somekeyspace.sometable
WHERE transdate > '2017-05-06'
      AND transdate < '2017-05-07'
      AND locationid = 1;

这个问题已经被其他人发布在stackoverflow上,但我似乎没有得到一个好的答案。 我可以用UDF解决这个问题吗,如果是这样,那会是什么样子?

我对 UDF 的问题是我不知道如何将整列值作为参数传递。

很可能

是"使用火花"和一个良好的缓存。

可以反转表,做一些事情,比如创建一个表,在存储客户端 (transdate, clientid) ID 的 transdate 上键入,然后遍历您范围内的所有 yyyy-mm-dd,count(*)将它们加在一起。如果每天有超过 5000 个左右的客户端 ID,则可能无法扩展(计数聚合非常昂贵(。可以添加更多分区桶进行转印,例如yyyy-mm-ddThh:00:00按小时或 15 分钟(四舍五入到最接近的 15 分钟(进行转印。

可以像上面一样做,但有一个预先计算并保存历史每日总计的工作,因此只有"今天"计数是昂贵的。可以将"今天"计数卸载到 redis(如果可以的话,超级日志日志会很合适,有一些 % 错误会很合适(或者如果你也需要它,也可以超快地卸载它并且可以在一天结束时刷新。

最新更新