在没有密钥的情况下加入两个相等的数据集

时间:2013-09-30 13:44:53

标签: join hadoop mapreduce

使用Hadoop我想加入两个具有相同记录数的文件,但不携带行号。例如A.txt

a xx
b y
c z

和B.txt

1 r
2 s
3 d

加入后我需要

a xx 1 r
b y 2 s
3 d c z

这是IOW完美的并排连接。我无法弄清楚如何在Hadoop中执行此操作,我相信我需要对这两个文件进行初始传递以附加行号?

使用Pig的答案,和/或地图/减少技巧的各种组合都很好。

3 个答案:

答案 0 :(得分:1)

这篇文章为您提供了一个提示:SO POST about special input format

输入格式可以生成行号作为键,而不是给出字节偏移量。这样你就可以简单地使用单位映射器(只发出键值)并在reducer中进行连接。这可能看起来很难,但只是在输入格式中覆盖了几个函数而且你已经完成了。

答案 1 :(得分:1)

这应该适用于Pig:

A = load 'A.txt';
B = load 'B.txt';

rankedA = RANK A;
joined = JOIN rankedA BY $0, B BY $0;

如果您愿意,可以使用FOREACH语句对列进行进一步重新排序。

答案 2 :(得分:0)

我认为由于这两个文件具有相同数量的记录,因此您只需使用一个传递(一个地图减少作业)就可以执行以下操作: -

  1. 您可以将这两个文件加载到两个不同的临时表中。
  2. 现在,您可以在Hive中创建UDF以生成行号(例如从1开始)并从Hive临时表中选择字段以创建包含三列的最终表,即额外列将包含行号。 / LI>
  3. 现在您可以使用行号加入两个最终表。
  4. 希望这可能有助于你的事业。