我想解决的问题似乎微不足道。我有大量的活动(实际上它们来自移动应用程序,所以它们是移动事件)。每个事件都由几个属性描述:
operating_system create_time version resolution model brand network_type etc.
我将这些事件存储在hdfs上,我试图解决的问题是允许用户近乎实时地分析这些事件。通过分析,我的意思是只能选择特定的列,有趣的日期范围,以及查看来自不同手机型号的事件数量。例如,假设我有以下数据集:
os1 2015-07-30 v1 200x200 model1 brand1 provider1
os1 2015-07-30 v1 200x200 model1 brand1 provider1
os1 2015-07-30 v1 200x200 model1 brand1 provider2
os1 2015-07-30 v1 200x200 model1 brand2 provider2
os1 2015-07-29 v1 200x200 model1 brand1 provider1
os2 2015-07-30 v1 200x200 model1 brand1 provider1
os1 2015-06-30 v1 200x200 model1 brand1 provider1
让我们假设用户想要从2015年7月开始查找不同手机的活动数量。他正在寻找的答案如下:
os1 2015-07-30 v1 200x200 model1 brand1 provider1 4
os1 2015-07-30 v1 200x200 model1 brand1 provider2 1
os1 2015-07-30 v1 200x200 model1 brand2 provider2 1
因为事件的数量巨大,我试图计算聚合并将它们存储在cassandra中。每天计算聚合,给出前面的示例数据集,我的聚合看起来像这样:
os1 2015-06-30 v1 200x200 model1 brand1 provider1 1
os1 2015-07-29 v1 200x200 model1 brand1 provider1 1
os1 2015-07-30 v1 200x200 model1 brand1 provider1 3
os1 2015-07-30 v1 200x200 model1 brand1 provider2 1
os1 2015-07-30 v1 200x200 model1 brand2 provider2 1
问题是它们仍然太多了。我仍然需要spark来运行按需任务来从所请求的日期范围中汇总聚合。它很慢,需要大量的网络传输。我读了很多关于HyperLogLog和其他类似算法的内容,但我不知道如何在这里使用它们。我并不真正关心确切的结果,估计对我来说非常好。谁能建议我能做什么?
答案 0 :(得分:0)
为您的数据添加其他字段。这个附加字段会将您的数据分解为较小的数据块(我们将其称为分箱数据)。例如1000记录给它一个bin。然后在每个bin中进行聚合。像:
1 os1 2015-06-30 v1 200x200 model1 brand1 provider1 1
1 os1 2015-07-29 v1 200x200 model1 brand1 provider1 1
1 os1 2015-07-30 v1 200x200 model1 brand1 provider1 3
.
.
2 os1 2015-07-30 v1 200x200 model1 brand1 provider2 1
2 os1 2015-07-30 v1 200x200 model1 brand2 provider2 1
.
这会减少你的洗牌次数并给你近似的结果。为了获得完整的结果,请执行额外的步骤来聚合来自垃圾箱的结果。