我有两个数据集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中实现它。有谁能够帮我?非常感谢!
答案 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”数据集作为作业的输入。然后,您可以在迭代输入时运行您的作业并查找“商品”。您可以使用分布式缓存将“货物”数据分发到群集中的每个节点。