使用MapReduce或其他分布式计算方法进行分析计算?
假设我有三个基本模型:用户、公司和访问。每次用户访问公司时,都会以这种格式记录一次访问使用MapReduce或其他分布式计算方法进行分析计算?,map,mapreduce,distributed-computing,reduce,Map,Mapreduce,Distributed Computing,Reduce,假设我有三个基本模型:用户、公司和访问。每次用户访问公司时,都会以这种格式记录一次访问(用户id、公司id、访问日期) 我希望能够计算出一家公司的平均访问间隔时间。不是总的访问量,而是他们的客户在返回商店之前平均等待的时间 例如,如果一个用户在星期二、星期三和星期五访问,则一个“间隔”为一天,一个“间隔”为两天=>(1,2)。如果另一个用户在星期一和星期五访问,则间隔为4天=>(4)。如果第三个用户只访问过一次,则不应考虑他。该公司用户访问的平均间隔时间为(1+2+4)/3=2.333天 如果我
(用户id、公司id、访问日期)
我希望能够计算出一家公司的平均访问间隔时间。不是总的访问量,而是他们的客户在返回商店之前平均等待的时间
例如,如果一个用户在星期二、星期三和星期五访问,则一个“间隔”为一天,一个“间隔”为两天=>(1,2)。如果另一个用户在星期一和星期五访问,则间隔为4天=>(4)。如果第三个用户只访问过一次,则不应考虑他。该公司用户访问的平均间隔时间为(1+2+4)/3=2.333天
如果我有成千上万的用户、用户和公司,我想为每家公司计算一个数字,我应该怎么做?我以前只做过基本的MapReduce应用程序,我不知道我的Map和Reduce步骤是什么。有人能帮我找出伪代码中的MapReduce吗?或者是否有其他我可以合理执行的分布式计算方法?作为记录,我希望每晚在数据库上执行此操作。过于简单的方法是有两个作业步骤 第一个作业步骤有一个映射器,以“公司:用户”和“访问日期”的形式写入关键值。在上面的示例中,映射器将编写如下内容:
"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"
...
这意味着对reducer的每次调用都会将单个用户的所有访问传递给单个公司。这意味着一个对reducer的调用将传入:
"user1:companyA" -> {2012/07/16, 2012/07/17, 2012/07/19}
另一个电话将传入:
"user2:companyA" -> {2012/07/15, 2012/07/19}
我假设这组日期(作为一个Iterable值传入)很容易管理,因为您可以对其进行排序,找出差距,并以“company”和“gap”的形式为每个差距编写一个键值对记录。例如,通过时:
"user1:companyA" -> {2012/07/16, 2012/07/17, 2012/07/19}
第一个作业的缩减器将写入上下文:
"companyA" -> 1
"compnayA" -> 2
第二个作业有一个传递映射器,它只将公司/差距信息传递给减速器。每次调用reducer都会为特定公司提供一个可计算的差距值。遍历数据以生成平均值,并以“company”和“average_gap”的形式写入键值对
如果原始访问集太大,我们可以讨论让hadoop使用一些自定义比较器为您进行排序。我对您使用“间隙”所做的操作感到有点困惑,您能详细说明吗?间隙是您定义的:用户连续两次访问公司之间的时间差。我会再编辑一些答案