我希望获得两个平面/ CSV文件源和目标的差异,它们具有相同的架构。
让我们说,
的Source.txt:
EmpId | RegionId |销售
001 | R01 | $ 10000
002 | R02 | $ 20000
003 | R03 | $ 30000
target.txt:
EmpId | RegionId |销售
001 | R01 | $ 10000
002 | R02 | $ 10000
004 | R04 | $ 40000
结果应该是:
EmpId1 | RegionId1 | Sales1 | EmpId2 | RegionId2 | Sales2 | Result_Status
001 | R01 | $ 10000 | 001 | R01 | $ 10000 |匹配
002 | R02 | $ 20000 | 002 | R02 | $ 10000 |无与伦比的
003 | R03 | $ 30000 | NULL | NULL | NULL |不匹配的
NULL | NULL | NULL | 004 | R04 | $ 40000 |无与伦比的
任何帮助都会受到欢迎!!
编辑:
如果给定2个文件的大小很大,这个问题可能看起来更简单,但我试图找到最好的方法,性能是这里的主要标准,技术可以是任何东西,甚至hadoop地图减少,我试过使用Hive但它有点慢。
答案 0 :(得分:1)
这是一种解决它的map-reduce方法(在高级伪代码中):
map(source):
for each line x|y|z:
emitIntermediate(x,(1,y|z))
map(target):
for each line x|y|z:
emitIntermediate(x,(2,y|z))
//make sure each list is sorted/ sort it yourself 1 is before 2 if both exists.
reduce(x, list):
if list.size() == 1:
(idx,y|z) <- list.first() //this is the configuration of the element in the list
if idx == 1:
emit(x|y|z|NULL|NULL|NULL|unmatched)
else:
emit(NULL|NULL|NULL|x|y|z|unmatched)
else:
(1,y1|z1) <- list.first()
(2,y2|z2) <- list.last()
m = (y1|z1 matches y2|z2 ? "matched" : "unmatched")
emit(x|y1|z2|x|y2|z2|m)
我们的想法是将reduce部分中的数据拆分为map阶段中的不同ID,并让reducers检查区域和销售是否匹配。
通过大型集群(以及分布式文件格式)实现它可以显着提高性能,因为map-reduce框架将工作分布在集群中。
例如,您可以将Hadoop用作实施框架。