嘿所有,刚刚开始使用hadoop并且很好奇如果你的日志文件看起来像这样,mapreduce中最好的方法是计算唯一访问者...
DATE siteID action username
05-05-2010 siteA pageview jim
05-05-2010 siteB pageview tom
05-05-2010 siteA pageview jim
05-05-2010 siteB pageview bob
05-05-2010 siteA pageview mike
并为每个网站找到每个网站的唯一身份访问者?
我以为mapper会发出siteID \ t用户名 reducer将为每个键保留一个唯一用户名的set(),然后发出该组的长度。然而,这可能会在内存中存储数百万个用户名,这似乎并不正确。谁有更好的方法?
我正在使用python流式传输
感谢
答案 0 :(得分:3)
您可以将其作为两阶段操作:
第一步,发出(username => siteID)
,并让reducer使用set
折叠多次出现的siteID - 因为你的网站通常比用户少得多,这应该没问题。
然后在第二步中,您可以发出(siteID => username)
并执行简单计数,因为已删除重复项。
答案 1 :(得分:1)
使用辅助排序对用户ID进行排序。这样,您就不需要在内存中有任何内容 - 只需流式传输数据,并在每次看到特定站点ID的值更改时递增您的独特计数器。
以下是一些documentation。
答案 2 :(得分:1)
我的aproach类似于tzaman给出的一个小扭曲
请注意,第一个reduce不需要覆盖任何记录。您只需检查密钥并生成输出即可。
HTH
答案 3 :(得分:0)
使用HiveQL对许多简单任务进行排序通常会更快。 Hive会将您的查询转换为Hadoop MapReduce。在这种情况下,您可以使用
SELECT COUNT(DISTINCT username) FROM logviews
您可以在此处找到更高级的示例: http://www.dataminelab.com/blog/calculating-unique-visitors-in-hadoop-and-hive/