将不同的参数传递给每个映射器

2024-01-11

我有一份使用多个映射器和一个减速器的工作。映射器几乎相同,除了 a 的值不同之外String他们用来产生结果。

目前我有几个类,每个类对应一个值String我提到过——感觉应该有更好的方法,不需要那么多的代码重复。有没有办法通过这些String值作为映射器的参数?

我的工作是这样的:

Input File A  ---->  Mapper A using
                       String "Foo"  ----+
                                         |--->  Reducer
                     Mapper B using  ----+
Input File B  ---->    String "Bar" 

我想把它变成这样的:

Input File A  ---->  GenericMapper parameterized
                               with String "Foo" ----+
                                                     |--->  Reducer
                     GenericMapper parameterized ----+ 
Input File B  ---->            with String "Bar"

Edit:这是我目前拥有的两个简化的映射器类。它们准确地反映了我的实际情况。

class MapperA extends Mapper<Text, Text, Text, Text> {
    public void map(Text key, Text value, Context context) {
        context.write(key, new Text(value.toString() + "Foo"));
    }
}

class MapperB extends Mapper<Text, Text, Text, Text> {
    public void map(Text key, Text value, Context context) {
        context.write(key, new Text(value.toString() + "Bar"));
    }
}

Edit:每个映射器应使用什么字符串仅取决于数据来自哪个文件。除了通过文件名之外,无法区分这些文件。


假设您使用文件输入格式,您可以在映射器中获取当前输入文件名,如下所示:

if (context.getInputSplit() instanceof FileSplit) {
    FileSplit fileSplit = (FileSplit) context.getInputSplit();
    Path inputPath = fileSplit.getPath();
    String fileId = ... //parse inputPath into a file id
    ...
}

您可以根据需要解析 inputPath,例如仅使用文件名或仅分区 ID 等来生成标识输入文件的唯一 ID。 例如:

/some/path/A -> A
/some/path/B -> B

为驱动程序中每个可能的文件“id”配置属性:

conf.set("my.property.A", "foo");
conf.set("my.property.B", "bar"); 

在映射器中如上所述计算文件“id”并获取值:

conf.get("my.property." + fileId);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将不同的参数传递给每个映射器 的相关文章

随机推荐