如何为这种情况编写mapreduce?

时间:2016-08-22 06:30:24

标签: hadoop mapreduce

这是数据集

  

UserId,类别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次查看该类别。

此方案的配置单元查询是:

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,category,impression_date分组     按countOfUsers asc;

排序

此场景的Mapreduce代码是什么?

1 个答案:

答案 0 :(得分:0)

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

我建议采用以下方法
步骤1.阅读文本并将完整的文本行作为键并执行字数统计(可以更好地说为行数,因为完整行是键出来的)

映射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输出作为记录
- 以“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