我想使用多个文件(实际上是2个文件)作为输入文件。
他们拥有相同的数据模式。 最后,我想从两个输入文件中获取数据。
例如,在A输入文件中,
A 1
B 2
C 3
在B输入文件中,
A 1
C 3
D 4
最后,我想生成一个像
这样的输出文件B 2
(是的,这是A - B
)的结果。
我怎么能在hadoop上达到这种情况?
答案 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 中的行。