我试图解决Spark Streaming中的一个(简化的)问题:让我说我有一个用户做的事件日志,其中每个事件都是一个元组(用户名,活动,时间) ),例如:
("user1", "view", "2015-04-14T21:04Z")
("user1", "click", "2015-04-14T21:05Z")
现在我想收集用户的事件来做一些分析。让我们说输出是对以下内容的分析:
("user1", List(("view", "2015-04-14T21:04Z"),("click", "2015-04-14T21:05Z"))
事件应保持 2个月。在此期间,此类活动可能会出现 500mion ,而数以百万计的独特用户是关键所在。
我的问题是:
updateStateByKey
做这样的事情是否可行?DStream.window
在这里没用,当我有2个月的长度窗口,想要几秒钟的幻灯片吗? P.S。
我发现,每张幻灯片上的所有键都会调用updateStateByKey
,这意味着每隔几秒就会调用数百万次。这让我对这个设计产生怀疑,而我宁愿考虑其他解决方案,如:
答案 0 :(得分:1)
我认为这取决于您将来如何查询数据。我有类似的情况。我刚刚通过mapPartitions和reduceByKey进行了转换,并将数据存储在Cassandra中。
答案 1 :(得分:0)
看起来你需要一个指数衰减窗口。
您可以在Rajaraman, Anand, and Jeffrey David Ullman. Mining of massive datasets. Cambridge University Press, 2011.中阅读有关它们的信息,请参阅第4.7节,特别是第4.7.3节了解实施细节。