我需要从我的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(如果可以的话,超级日志日志会很合适,有一些 % 错误会很合适(或者如果你也需要它,也可以超快地卸载它并且可以在一天结束时刷新。