【问题标题】:Use MapReduce or other distributed computation method for an analytics calculation?使用 MapReduce 或其他分布式计算方法进行分析计算?
【发布时间】:2012-07-17 21:31:52
【问题描述】:

假设我有三个基本模型:用户、公司和访问。每次用户去公司时,都会以(user_id, company_id, visit_date)这种格式记录一次访问。

我希望能够计算一家公司的平均访问时间。不是总体访问量,而是他们的一位顾客在返回商店之前平均等待多长时间。

例如,如果一位用户在周二、周三和周五访问,则给出 1 天的“间隙”和 2 天的“间隙” => (1, 2)。如果另一个用户在周一和周五访问,则有 4 天的间隔 => (4)。如果第三个用户只访问过一次,则不应考虑他。公司用户访问的平均时间为 (1 + 2 + 4) / 3 = 2.333 天。

如果我有成千上万的用户、水龙头和公司,我想为每家公司计算一个数字,我应该怎么做?我以前只做过基本的 MapReduce 应用程序,我不知道我的 Map 和 Reduce 步骤是什么来完成这项工作。任何人都可以帮我找出伪代码中的 MapReduce 吗?还是有其他一些我可以合理执行的分布式计算方法?作为记录,我想每晚对我的数据库执行此操作。

【问题讨论】:

    标签: map mapreduce distributed-computing reduce


    【解决方案1】:

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

    第一个作业步骤有一个映射器,以“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"
    ...
    

    这意味着对 reducer 的每次调用都会将单个用户的所有访问传递给单个公司。这意味着对 reducer 的一次调用将传入:

    "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}
    

    第一个作业的 reducer 将写入上下文:

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

    第二个作业有一个传递映射器,它只是将公司/差距信息传递给减速器。对 reducer 的每次调用都会为特定公司提供一个可迭代的差距值。遍历数据以产生平均值,并以“company”和“average_gap”的形式写入键值对。

    如果原始访问集太大,我们可以讨论让 hadoop 使用一些自定义比较器为您进行排序。

    【讨论】:

    • 我对你对“差距”所做的事情感到有些困惑,你能详细说明一下吗?
    • 差距就像您定义的那样:用户连续两次访问公司之间的时间差。我会再修改一下答案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-01
    • 1970-01-01
    • 2015-09-03
    • 1970-01-01
    • 2011-01-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多