我想使用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
这是一个非常完美的并排连接。我不知道如何在hadoop中做到这一点,我相信我需要对这两个文件的初始传递来附加行号?使用pig和/或各种map/reduce技巧组合的答案都很好。
wwtsj6pe1#
这篇文章给了你一个提示:关于特殊输入格式的文章输入格式可以产生行号作为键,而不是给出字节偏移量。这样,您就可以简单地使用一个单元Map器(只发送键值)并在reducer中进行连接。这看起来很难,但它只是在输入格式中覆盖了几个函数,您就完成了。
kq0g1dla2#
这应该适用于pig:
A = load 'A.txt'; B = load 'B.txt'; rankedA = RANK A; joined = JOIN rankedA BY $0, B BY $0;
然后可以使用 FOREACH 如果你愿意的话。
FOREACH
4szc88ey3#
我认为,由于这两个文件的记录数相等,因此您可以只使用一个过程(一个map reduce作业)来执行以下操作:-您可以将这两个文件加载到两个不同的临时表中。现在您可以在配置单元中创建一个自定义项来生成行号(比如从1开始),并从配置单元临时表中选择字段来创建最终表,该表将包含三列,即额外的列将包含行号。现在可以使用行号连接最后两个表。希望这能对你的事业有所帮助。
3条答案
按热度按时间wwtsj6pe1#
这篇文章给了你一个提示:关于特殊输入格式的文章
输入格式可以产生行号作为键,而不是给出字节偏移量。这样,您就可以简单地使用一个单元Map器(只发送键值)并在reducer中进行连接。这看起来很难,但它只是在输入格式中覆盖了几个函数,您就完成了。
kq0g1dla2#
这应该适用于pig:
然后可以使用
FOREACH
如果你愿意的话。4szc88ey3#
我认为,由于这两个文件的记录数相等,因此您可以只使用一个过程(一个map reduce作业)来执行以下操作:-
您可以将这两个文件加载到两个不同的临时表中。
现在您可以在配置单元中创建一个自定义项来生成行号(比如从1开始),并从配置单元临时表中选择字段来创建最终表,该表将包含三列,即额外的列将包含行号。
现在可以使用行号连接最后两个表。
希望这能对你的事业有所帮助。