【问题标题】:How to write mapreduce for this scenario?如何为这种情况编写 mapreduce?
【发布时间】:2016-08-23 00:27:31
【问题描述】:

这是数据集

用户 ID、类别 ID、日期

A,123, 2016-01-01
A,123, 2016-01-01
B,123, 2016-01-01
C,123, 2016-01-01
C,123, 2016-01-01
D,123, 2016-01-01
E,123, 2016-01-01

需要如下输出:

日期、类别 ID、观看频率、用户数量

2016-01-01, 123, 1, 3
2016-01-01, 123, 2, 2

说明:

根据数据集,有 3 个用户(B、D、E)只查看了一次该类别。
有 2 位用户(A、C)查看了该类别 2 次。

此场景的 Hive 查询是:

select numberOfUsers, category, impression_date, count(numberOfUsers) as countOfUsers from ( select count(user_id) as numberOfUsers, category, impression_date from userVisit 按类别分组,user_id,impression_date) temp 按 numberOfUsers、类别、impression_date 分组 按 countOfUsers asc 排序;

这个场景的 Mapreduce 代码是什么?

【问题讨论】:

    标签: hadoop mapreduce


    【解决方案1】:

    由于您使用的是嵌套查询,因此您可能必须在数据集上运行两次 MapReduce(链)才能获得所需的结果。

    我建议采用以下方法。

    步骤 1. 阅读文本并将整行文本作为 Key 并执行字数统计(可以更好地称为 Row Count,因为整行是 out 关键)

    地图 1 输出-
    关键~价值
    A,123,2016-01-01 ~ 1
    A,123,2016-01-01 ~ 1
    B,123,2016-01-01 ~ 1
    C,123,2016-01-01 ~ 1
    C,123,2016-01-01 ~ 1
    D,123,2016-01-01 ~ 1
    E,123,2016-01-01 ~ 1

    减少 1 个输出-
    关键~价值
    A,123,2016-01-01 ~ 2
    B,123,2016-01-01 ~ 1
    C,123,2016-01-01 ~ 2
    D,123,2016-01-01 ~ 1
    E,123,2016-01-01 ~ 1



    步骤 2. 现在将此输出作为下一个 MapReduce 的输入,并对这一行执行字数统计。当然,您将不得不根据您想要的输出重新排列和修改您的输入键。
    -从previos输出中读取key和value作为记录
    -将该记录重新排列为“A,2016-01-01,123 2”格式
    -删除第一个字符和','并将其余记录用作单词(行)计数的关键字

    地图 2 输出--

    关键 ~ 价值
    2016-01-01,123 2~1
    2016-01-01,123 1~1
    2016-01-01,123 2~1
    2016-01-01,123 1~1
    2016-01-01,123 1~1

    减少 2 输出--

    关键 ~ 价值
    2016-01-01,123 1~3
    2016-01-01,123 2 ~2

    【讨论】:

    • 链接作业的示例是link
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-02
    • 1970-01-01
    • 2021-11-30
    • 2021-05-21
    相关资源
    最近更新 更多