如何根据hadoop中的公共密钥连接两个数据集?

时间:2012-07-23 09:20:00

标签: java hadoop mapreduce hive apache-pig

我有两个数据集Customer和Goods。 Customer数据集将客户ID作为密钥,并将客户购买的商品ID列为值。货物数据集具有良好的关键价值和价格。如何根据外国商品的ID加入这两个数据集?

customer dataset:
customer id, goods id1,goods id2, ...

goods dataset
goods id1, price1
goods id2, price2

The join result dataset I want:
customer id1,price1,price2,...
customer id2,pric3e,price4,...

我是hadoop的新手。我知道它可以在Pig和Hive中完成,但我想在带有Hadoop的java中实现它。有谁能够帮我?非常感谢!

3 个答案:

答案 0 :(得分:1)

检查Data-Intensive Text Processing with MapReduce文档中的Relational Joins部分。

答案 1 :(得分:1)

我可以补充保罗的答案。您可以在此处使用分布式缓存的概念。将较小的文件(我猜是商品数据集)加载到分布式缓存中。 (默认情况下,分布式缓存最多可容纳10Gb的数据)。然后,您可以使用法线贴图读取客户数据集,并使用分布式缓存中的匹配数据执行连接。

有趣的是,无论datanode如何,每个映射器都可以访问分布式缓存数据中的数据。

http://bigdatapartnership.com/map-side-and-reduce-side-joins/可以为您提供有关加入MapReduce应用程序的见解。

Hadoop:权威指南作者:Tom White提供了Map Side Join,Reduce Side Join和Join with Distributed Cache的程序示例。

Chuck Lam的 Hadoop In Action 的第5章也讨论了连接问题。

答案 2 :(得分:0)

“商品”数据集有多大?如果它足够小,最简单的方法是将其加载到映射器的内存中(在hashmap中),然后将“Customers”数据集作为作业的输入。然后,您可以在迭代输入时运行您的作业并查找“商品”。您可以使用分布式缓存将“货物”数据分发到群集中的每个节点。

相关问题