1

使用 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 和/或 map/reduce 技巧的各种组合的答案都很好。

4

3 回答 3

1

这篇文章给你一个提示:SO POST about special input format

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

于 2013-10-01T12:10:58.970 回答
1

这应该在猪中工作:

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

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

FOREACH然后,您可以根据需要使用语句进一步重新排序列。

于 2013-10-01T14:07:18.187 回答
0

我认为由于这两个文件具有相同数量的记录,因此您可以执行以下操作以仅使用一次传递(一个 map reduce 作业)加入:-

  1. 您可以将这两个文件加载到两个不同的临时表中。
  2. 现在您可以在 Hive 中创建一个 UDF 以生成行号(例如从 1 开始)并从 Hive 临时表中选择字段以创建包含三列的最终表,即额外的列将包含行号。
  3. 现在您可以使用行号加入两个决赛桌。

希望这对您的事业有所帮助。

于 2013-10-01T07:52:01.400 回答