Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hadoop 如何设计用于合并两个文本文件的MapReduce模型_Hadoop_Merge_Mapreduce - Fatal编程技术网

Hadoop 如何设计用于合并两个文本文件的MapReduce模型

Hadoop 如何设计用于合并两个文本文件的MapReduce模型,hadoop,merge,mapreduce,Hadoop,Merge,Mapreduce,例如,我有两个文件,A和B。它们都是文本文件 A包含一行文本,如下所示: I'm A I'm B1 I'm B2 I'm B3 // Two parameters, A and B public void merge(File A, File B) { String lineA = A.firstLine; for (Each lineB in B) { String result = lineA + " " + lineB; File.wir

例如,我有两个文件,A和B。它们都是文本文件

A包含一行文本,如下所示:

I'm A
I'm B1
I'm B2
I'm B3
// Two parameters, A and B
public void merge(File A, File B) {
    String lineA = A.firstLine;
    for (Each lineB in B) {
        String result = lineA + " " + lineB;
        File.wirte(result, "ResultFile", appended);
    }
}
B包含三行文字,如下所示:

I'm A
I'm B1
I'm B2
I'm B3
// Two parameters, A and B
public void merge(File A, File B) {
    String lineA = A.firstLine;
    for (Each lineB in B) {
        String result = lineA + " " + lineB;
        File.wirte(result, "ResultFile", appended);
    }
}
我的例外情况是将A的唯一一行添加到B的每一行的前面,因此结果将是:

I'm A I'm B1
I'm A I'm B2
I'm A I'm B3
对我来说,最困难的部分是如何理解MapReduce作业的参数。在传统函数中,我可以让A和B作为两个参数,然后在规则中合并它们。一些伪代码如下所示:

I'm A
I'm B1
I'm B2
I'm B3
// Two parameters, A and B
public void merge(File A, File B) {
    String lineA = A.firstLine;
    for (Each lineB in B) {
        String result = lineA + " " + lineB;
        File.wirte(result, "ResultFile", appended);
    }
}
但在MapReduce阶段,exmaple没有“传统参数”:

public void map(LongWritable key, Text value, Context context) {
    String line = value.toString();
    try {
        context.write(new Text(line), new Text(""));
    } catch (IOException e) {
        e.printStackTrace();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}
我知道上面的代码将逐行读取文件,将每行用作键并将值设置为空,然后将键值对写入文件

但同样,上面的映射程序代码没有传统的参数,我不知道如何执行合并字符串的逻辑,并写出结果

下面是我现在所想的伪代码,我的设计是正确的还是方向错误?我应该如何设计MapReduce作业?一些示例代码将非常有用

// I think I should pass in two Files
// So I can merge the line of them
public void map(File A, File B, Context context) {
    String key = A.firstLine();
    for (each LineB in B) {
        String value = key + " " + lineB;
    }
    try {
        context.write(new Text(""), value);
    } catch (IOException e) {
        e.printStackTrace();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

这是一个交叉连接——将a中的每个记录连接到B中的每个记录。幸运的是,这是一个覆盖良好的MapReduce设计模式

解决方案取决于数据集的大小。如果A或B能进入记忆,你就幸运了。只需将其中一个添加到DistributedCache,并仅将另一个读取到映射器中即可。你甚至不需要减速器


如果两个数据集都很大,则您的解决方案必须涉及编写自定义输入拆分,以保证每组数据的输出时间足以与另一组中的所有块匹配。请参阅-本示例也包含在MapReduce设计模式一书中。

谢谢!现在我有了清晰的设计模式,你推荐的书非常有帮助!