2012-09-15 28 views
2

我现在有交易有以下的列的列表:在1计数多个按键的MapReduce

TradeID, SellerID, FishType, Price, Qty 

我希望得到

  1. 每个SellerID
  2. 的的计数数量每个鱼类型号

目前,我已经写输出< FishType数量>映射器以便总结数量每个FishType。但是,要获得SellerID的计数,是否必须编写单独的mapreduce任务?还是有一种方法让我在同一个mapreduce任务中这样做?

我已经考虑过使用计数器,但是在编码的时候,记录中的sellerID在我看来是未知的,并且可能有太多无法跟踪使用计数器。在我看来,这也是对Counter功能的滥用。

请指教。

回答

4

做到这一点的显而易见的方法是有一个单独的mapreduce作业。

执行此操作的一个棘手方法是“超载”您的密钥。我猜SellerIDFishType都是字符串。当它是SellerID时,将"S:"添加到字符串的前面,并且FishType"F:"添加到字符串的前面。

然后,当你到达减速机,你会得到两种不同类型的reduce函数调用的一个:它开始"S:",在这种情况下,它是一个SellerID,和一个在那里它开始"F:",在这种情况下它是FishType。根据这一观察,你在减速器中有单独的逻辑。

最后,使用MultipleOutputs(小心.mapred..mapreduce.版本,它们互不兼容)将结果写出来,希望两个不同的目录:一个用于FishType,一个用于SellerID


您可能想为此使用Pig或Hive。

+0

我一直在想你的“前缀”解决方案。虽然我不明白为什么这不起作用,但我担心它是否实际上破坏了MapReduce框架的整体目的。由于该框架将不能对中间密钥进行正确的分组和排序,即,这些密钥基本上不是由FishType或SellerID排序的,所以这些密钥将不会连续地馈送到缩减器中,因此导致分离的输出。 – Deyang

+1

“F:Salmon”所有的东西都会发送到同一个减速器,并且会一起分析。这是你脱节的意思吗?你在这里所做的只是重载键空间来一次执行两个任务。 –

+0

啊,你是对的。仍然试图将我的头围绕整个mapreduce框架。谢谢。 – Deyang