2012-07-18 279 views
0

假设我有三种基本模型:用户,公司和访问。每次用户访问公司时,都会以此格式记录访问(user_id, company_id, visit_date)使用MapReduce或其他分布式计算方法进行分析计算?

我希望能够计算公司访问之间的平均时间。没有整体访问,但具体来说,他们的客户平均多久才返回商店等待。

例如,如果一个用户在星期二,星期三和星期五访问了一天的一个“缺口”,两天的一个“缺口”=>(1,2)。如果另一个用户在星期一和星期五访问,则会给​​出4天的差距=>(4)。如果第三个用户只访问过一次,他不应该考虑。用户访问该公司的平均时间为(1 + 2 + 4)/ 3 = 2.333天。

如果我有成千上万的用户,水龙头和公司,我想为每家公司计算一个数字,我应该如何处理这个问题?我之前只做过基本的MapReduce应用程序,但我无法弄清楚我的Map和Reduce步骤是如何完成的。任何人都可以帮助我找出伪代码中的MapReduce?或者还有其他一些我可以合理执行的分布式计算方法吗?为了记录,我想每晚在我的数据库上执行此操作。

回答

0

过分简单化的方法是有两个工作步骤。

第一个作业步骤有一个映射器,以“company:user”和“visit_date”的形式编写关键值。在上面的例子中,映射器会写类似:

"user1:companyA" -> "2012/07/16" 
"user1:comapnyA" -> "2012/07/17" 
"user1:comapnyA" -> "2012/07/19" 
"user2:comapnyA" -> "2012/07/15" 
"user2:comapnyA" -> "2012/07/19" 
... 

这意味着每次调用减速将由单个用户通过您的访问,以一个单一的公司。这意味着,一个调用减速将经过:

"user1:companyA" -> {2012/07/16, 2012/07/17, 2012/07/19} 

和另一个电话将通过在:

"user2:companyA" -> {2012/07/15, 2012/07/19} 

我假设设定日期(传递以Iterable值)是根据您的分类轻松进行管理,找出差距,并以“公司”和“差距”形式为每个差距记录一个关键值对。例如,通过在:

"user1:companyA" -> {2012/07/16, 2012/07/17, 2012/07/19} 

第一份工作的减速将会写入方面:

"companyA" -> 1 
"compnayA" -> 2 

第二职业都有,只是通公司/ GAP信息到直通映射器减速器。每次调用reducer都会为特定公司提供可计算的间隙值。迭代数据以产生平均值,并以“公司”和“平均值”格式编写关键值对。

如果原来的一组访问量太大,我们可以讨论让hadoop使用一些自定义比较器为您排序。

+0

我对你正在做的“差距”有点困惑,你能详细说明一下吗? – 2012-07-19 13:57:19

+0

差距就像您定义的那样:用户对公司进行的两次连续访问之间的时间差异。我会再编辑一些答案 – 2012-07-19 15:13:38