【发布时间】:2012-11-05 15:25:25
【问题描述】:
我有以下文件:
City.dat
Andorra la Vella|ad|Andorra la Vella|20430|42.51|1.51|
Canillo|ad|Canillo|3292|42.57|1.6|
Encamp|ad|Encamp|11224|42.54|1.57|
...
Country.dat
Andorra|ad|Andorra la Vella|Andorra la Vella|69865|468|
United Arab Emirates|ae|Abu Dhabi|Abu Dhabi|2523915|82880|
Afghanistan|af|Kabul|Kabul|28513677|647500|
...
我需要做的是进行 Map Side Join 以获取 Country.dat 文件中列出的人口(City.dat 中的第 4 列)和每个首都的名称(Country.dat 中的第 3 列)。所以我得到了基本的想法。两个文件的连接键将是城市值(City.dat 中的第 1 列和 Country.dat 中的第 3 列)。这样我应该得到一个表格,其中包含我需要的所有信息,每个首都都有一行。
但是这在 Hadoop 中究竟是如何工作的?我如何告诉 Hadoop 两个文件中的连接键是什么(我首先需要从每一行中解析出来,不是吗?)我找到的所有代码看起来都是这样的:
inner(tbl(org.apache.hadoop.mapreduce.lib.input.SequenceFileInputFormat.class,
"/user/cloudera/City.dat"),
tbl(org.apache.hadoop.mapreduce.lib.input.SequenceFileInputFormat.class,
"/user/cloudera/Country.dat"))
这只是定义了应该连接的两个文件。但是如何定义连接键以及我定义为记录的内容(在我的情况下,每个文件的一行应该是记录)?
【问题讨论】:
-
您是否有特定的原因想要进行 map-side join 而不是 reduce-side join?您假设这两个文件之一相对较小(足以放入内存)。从这种特定情况可以看出,另一个文件也会相对较小。因此,您不妨跳过 hadoop 并编写一个带有哈希表的 java 应用程序。除非有您未提及的特定原因,否则正常的 reduce-side 连接会更合适。
-
我需要使用 Hadoop,但我也可以进行 Reduce 侧连接。两个文件都小于 2Mb。 Reduce Side join 有什么优势?
-
我刚刚读过它,你是完全正确的。 Reduce Side Join 是我应该使用的......
标签: join hadoop mapreduce inner-join