映射减少继续流的作业

时间:2017-05-06 14:10:18

标签: java hadoop mapreduce

我有一个包含文本数据的巨大文本文件。文件'每行包含12个字符的数据。我需要使用map reduce job从该文件中找到5个字符的子字符串。

输入文件。

abcdefghijkl
kahfdjshjsdh
sdfkjsdjkjks

要搜索的值

cdefg

' cdefg'可以出现在文件中的任何位置。它可以分为两行。所以我不知道如何创建当前行的最后两个字符和下一行的下一个3字符的映射。

1 个答案:

答案 0 :(得分:0)

  

我有一个包含12个字符的行的文件,我想找到5个   该文件中字符串的字符。在Mapper中我得到了12   线的字符,可以创建两个5字符的地图,左边2   角色,并希望从下一行得到下一个3个字符,并希望   创建它的地图。所以在reducer中我可以将这些地图与我的地图进行比较   字符串。

您可以将所有行连接在一起,然后可以使用5个字符将结果拆分为Splitting a string at every n-th character

abcdefghijklkahfdjshjsdhsdfkjsdjkjks
[abcde, fghij, klkah, fdjsh, jsdhs, dfkjs, djkjk, s]

您可以从这段代码中激发解决方案:

File file = new File("myFile.txt");
try {
    Scanner scanner = new Scanner(file);
    String result = "";
    while (scanner.hasNextLine()) {
        String line = scanner.nextLine();
        result += line;
    }
    System.out.println(result);
    //here you can use this array
    String spl[] = result.split("(?<=\\G.....)");

    System.out.println(Arrays.toString(spl));
} catch (FileNotFoundException e) {
    e.printStackTrace();
}

<强>输出

abcdefghijklkahfdjshjsdhsdfkjsdjkjks
[abcde, fghij, klkah, fdjsh, jsdhs, dfkjs, djkjk, s]

修改

  

我想创建这样的地图abcdefghijklkahfdjshjsdhsdfkjsdjkjks   [abcde,bcdef,cdefg,defgh ...]

您可以像这样解决这个问题:

String str = "abcdefghijklkahfdjshjsdhsdfkjsdjkjks";
List<String> list = new ArrayList<>();

for (int i = 0; i < str.length()-4; i++) {
    String s = "";
    for (int j = i; j < i+5; j++) {
        s+=result.charAt(j);
    }
    list.add(s);
}

<强>输出

[abcde, bcdef, cdefg, defgh, efghi, fghij, ghijk, ...., djkjk, jkjks]