【问题标题】:How to join two datasets according to their common key in hadoop?如何根据hadoop中的公共键连接两个数据集?
【发布时间】:2012-07-23 09:20:00
【问题描述】:

我有两个数据集 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 中实现它。有谁能够帮助我?非常感谢!

【问题讨论】:

    标签: java hadoop mapreduce hive apache-pig


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      也许我可以补充一下保罗的回答。您可以在这里使用分布式缓存的概念。将较小的文件(我猜在您的情况下是 goods dataset)加载到分布式缓存中。 (分布式缓存默认最多可容纳 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 章也讨论了连接。

      【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-08-02
        • 1970-01-01
        • 2019-05-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多