2

我有两个数据集 Customer 和 Goods。客户数据集将客户 ID 作为键,并将客户购买的商品 ID 列表作为价值。Goods 数据集将其作为关键,将其价格作为价值。如何根据外键商品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 中实现它。有谁能够帮我?非常感谢!

4

3 回答 3

1

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

于 2012-07-23T12:21:59.503 回答
1

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

有趣的事实是,每个映射器都可以访问分布式缓存数据中的数据,而与数据节点无关。

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 章也讨论了连接。

于 2012-07-23T13:25:57.587 回答
0

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

于 2012-07-23T09:54:08.790 回答