这是否意味着第一个mapreduce的输出作为第二个mapreduce作业的输入?那么,完全有两个mapreduce工作?如果输入是一对夫妇(客户端,日期),则输出为(date,client,max_requests)。如何使用两个mapreduce作业的管道来查找每天请求最多的客户端。
答案 0 :(得分:0)
MR本质上是一种生成按不同键排序的数据集输出的方法。 reduce函数已经可以汇总到最终结果。
在您的情况下,Mapper会将输入数据映射到您描述的类型的记录。
,, other_data
并将其映射到:
< _>,other_data
生成复合键可能最简单。您可以将此映射到每天和每个客户端正确排序的字符串类型,而不是创建实现K,V的子类:
YYYYMMDD _
这可以保证每个客户端每天的所有记录都由同一个reducer处理。然后,您可以简单地计算记录数并将其作为当天的新记录输出。然后分解原始密钥并发出看起来像的新记录:
YYYYMMDD,客户端
然后有选项: - 如果适合,则将文件加载到内存中并确定每天的最大值。 - 将文件加载到数据库中并执行SQL选择 - 运行另一个MR工作:
身份映射器:YYYYMMDD,客户端,< #requests> - > YYYYMMDD(关键)+客户端,#requests
然后在reducer中,您现在可以获得一天的所有客户。然后,您只需每天维护最高#请求的状态以及哪个客户端以及日期更改或到达文件末尾时,输出具有最高编号的客户端ID。
我个人认为最简单的方法是从谷歌云平台使用BigQuery。您可以将文件(gzip)加载到一个简单的模式中,并针对该文件运行BQ语句:
select date, client, num_requests, row_number() over(partition by date order by num_requests desc) as rn
from (
select date, client, count(client) as num_requests from my_table
group by date, client
) as T
where rn = 1