我有一个数据如下的文件

City,Quarter,Classification,Index
Bordeux,Q1,R,3
Krakow,Q1,U,2
Halifax,Q1,U,4

我需要找出每个分类中的最高索引,并将它们写入两个单独的文件中。输出应为
Bordeux,Q1,R,3
Halifax,Q1,U,4

如何在Mapper中加载数据,因为它需要键/值对。在mapper中,程序员似乎不应该对数据做任何修改。因此,如何将其加载到Context对象中。

我认为Reducer不会更改键或值的数据类型。如果是这样,我将注入(inject)我的逻辑以找到最重要的记录,然后在那儿如何组织成上下文对象。

我不知道如何进行。

必要的指针将帮助我进一步前进。

最佳答案

在您的情况下,当您在Mapper中读取文件时,输入键是行的ObjectId,值是行本身。因此,换句话说,文件的每一行都将在Mapper中作为值字段接收。现在,Mapper的输出(键,值)应为(分类,索引)。
Mapper的输出将成为化简器的输入(键,值)。因此, reducer 将接收(分类,可迭代)作为输入。因此,对于每个分类,您可以遍历索引列表以获取最大值,而 reducer 的输出将为(Classification,Max)

在这种情况下,Mapper和Reducer的输出键和值类型相同。

但是,关于将其写入单独的行:仅当每个键都路由到不同的reducer实例时,才会生成单独的文件。因此,在您的情况下,reducer的总数应等于唯一分类的总数(尽管在资源利用率方面不是很好)。因此,您必须编写一个自定义分区程序才能实现

关于hadoop - 如何在Mapper中映射值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46066334/

10-12 23:46