如何将多个输入文件用作输入文件?

时间:2010-12-27 11:52:37

标签: hadoop

我想使用多个文件(实际上是2个文件)作为输入文件。

他们拥有相同的数据模式。 最后,我想从两个输入文件中获取数据。

例如,

在A输入文件中,

A 1
B 2
C 3

在B输入文件中,

A 1
C 3
D 4

最后,我想生成一个像

这样的输出文件
B 2

(是的,这是A - B)的结果。

我怎么能在hadoop上达到这种情况?

1 个答案:

答案 0 :(得分:3)

当然,特别是如果你不关心线的顺序。

首先,让你的映射器发出(line, filename)对:

File A:
(0, "A 1")→("A 1", A)
(4, "B 2")→("B 2", A)
(8, "C 3")→("C 3", A)
File B:
(0, "A 1")→("A 1", B)
(4, "C 3")→("C 3", B)
(8, "D 4")→("D 4", B)

(假设您使用TextInputFormat作为InputFormat,因此传入的键是文件中的位置。您可以在map函数中使用((FileSplit) context.getInputSplit()).getPath()获取文件名。)

在reduce阶段,Hadoop将收集与每个键(行)关联的值(文件名),并将其传递给reducer。在你的reducer中,你应该只发出只有文件名 A 的行,并且不为其他行发射任何东西:

("A 1",{A,B})→nothing
("B 2",{A})→"B 2"
("C 3",{A,B})→nothing
("D 4",{B})→nothing

结果将只是文件 A 中的行。