这是否意味着第一个mapreduce的输出作为第二个mapreduce作业的输入?那么,总共有两个mapreduce工作?如果输入是一对夫妇的序列(客户机,日期),则输出是(日期,客户机,最大\u请求)。如何使用两个mapreduce作业的管道来查找每天请求最多的客户机。
w6lpcovy1#
mr本质上是一种生成按不同键排序的数据集输出的方法。reduce函数已经可以聚合到最终结果。在您的例子中,Map器会将输入数据Map到您描述的类型的记录。、其他数据并将其Map到:其他数据生成复合密钥可能是最简单的。与创建实现k,v的子类不同,您可以将其Map到一个字符串类型,该类型每天和每个客户机都正确排序:yyyymmdd年_这保证了每个客户机每天的所有记录都由同一个reducer处理。然后,您可以简单地计算记录的数量,并将其作为当天的新记录输出。然后分解原始密钥并发出如下新记录:yyyymmdd,客户,还有一些选项:-如果合适的话,将文件加载到内存中,并确定每天的最大值。-将文件加载到数据库并执行sql选择-运行另一个mr作业:身份Map器:yyyymmdd,client,<#requests>->yyyymmdd(key)+client,#requests然后在减速机中,您现在可以在一天内获得所有客户。然后,您只需维护每天的状态,即最高的请求是什么,针对哪个客户机,以及当日期更改或到达文件末尾时,输出具有最高编号的客户机id。我个人认为最简单的方法是使用google云平台的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
1条答案
按热度按时间w6lpcovy1#
mr本质上是一种生成按不同键排序的数据集输出的方法。reduce函数已经可以聚合到最终结果。
在您的例子中,Map器会将输入数据Map到您描述的类型的记录。
、其他数据
并将其Map到:
其他数据
生成复合密钥可能是最简单的。与创建实现k,v的子类不同,您可以将其Map到一个字符串类型,该类型每天和每个客户机都正确排序:
yyyymmdd年_
这保证了每个客户机每天的所有记录都由同一个reducer处理。然后,您可以简单地计算记录的数量,并将其作为当天的新记录输出。然后分解原始密钥并发出如下新记录:
yyyymmdd,客户,
还有一些选项:-如果合适的话,将文件加载到内存中,并确定每天的最大值。-将文件加载到数据库并执行sql选择-运行另一个mr作业:
身份Map器:yyyymmdd,client,<#requests>->yyyymmdd(key)+client,#requests
然后在减速机中,您现在可以在一天内获得所有客户。然后,您只需维护每天的状态,即最高的请求是什么,针对哪个客户机,以及当日期更改或到达文件末尾时,输出具有最高编号的客户机id。
我个人认为最简单的方法是使用google云平台的bigquery。您可以将(gzip)中的文件加载到一个简单的模式中,并针对该模式运行bq语句: