这是数据集
用户Id,类别Id,日期
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
2016-01-01 E, 123,
需要如下输出:
<标题>解释:日期,类别Id,观看次数,用户数
2016-01-01, 123, 1,3
2016-01-01, 1,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)进行分组按用户数量、类别、印象日期分组sort by countOfUsers;
这个场景的Mapreduce代码是什么?
标题>由于您使用的是嵌套查询,因此您可能必须在数据集上运行两次MapReduce (chain)才能获得所需的结果。
我建议采用以下方法。
步骤1。读取文本并将整行文本作为键并执行单词计数(可以更好地说为行计数,因为整行是键)
图1输出-
键~值
中国机械工程,2016,2016-01-01 ~ 1
中国机械工程,2016,2016-01-01 ~ 1
中华人民大学学报(自然科学版),2016-01-01 ~ 1
中国机械工程,2013,2016-01-01 ~ 1
中国机械工程,2013,2016-01-01 ~ 1
D,123,2016-01-01 ~ 1
机电工程,2016,2016-01-01 ~ 1
减少1个输出-
键~值
中国机械工程,2016,2016-01-01 ~ 2
中华人民大学学报(自然科学版),2016-01-01 ~ 1
中国机械工程,2016,2016-01-01 ~ 2
D,123,2016-01-01 ~ 1
中国机械工程,2016-01-01 ~ 1
步骤2。现在将此输出作为下一个MapReduce的输入,并对这一行执行单词计数。当然,您必须根据需要的输出重新排列和修改输入键。
-读取前面输出的键和值作为记录
-将此记录重新排列为"A,2016-01-01 1,123 2"
-删除第一个字符和',',并使用记录的其余部分作为字(行)计数的关键字
Map 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 2 ~2