Mapreduce/Hadoop中两个数据集的连接

Mapreduce/Hadoop中两个数据集的连接,hadoop,join,mapreduce,distributed,Hadoop,Join,Mapreduce,Distributed,有人知道如何在Hadoop中实现两个数据集之间的自然连接操作吗 更具体地说,我需要做的是: 我有两组数据: 存储为(平铺编号,点id:point\u info)的点信息,这是一个1:n键值对。这意味着对于每个磁贴编号,可能有几个点id:point\u info 行信息存储为(tile\u编号,Line\u id:Line\u信息),这也是一个1:m键值对,对于每个tile\u编号,可能有多个Line\u id:Line\u信息 正如您所看到的,两个数据集之间的tile_编号是相同的。现在我真正需

有人知道如何在Hadoop中实现两个数据集之间的自然连接操作吗

更具体地说,我需要做的是:

我有两组数据:

  • 存储为(平铺编号,点id:point\u info)的点信息,这是一个1:n键值对。这意味着对于每个磁贴编号,可能有几个点id:point\u info

  • 行信息存储为(tile\u编号,Line\u id:Line\u信息),这也是一个1:m键值对,对于每个tile\u编号,可能有多个Line\u id:Line\u信息

  • 正如您所看到的,两个数据集之间的tile_编号是相同的。现在我真正需要的是根据每个tile_编号将这两个数据集连接起来。换句话说,对于每个瓷砖编号,我们有n个点id:point\u info和m个线id:line\u info。我要做的是将所有点\ id:point\信息对与每个瓷砖编号的所有线\ id:line\信息对连接起来


    为了澄清,这里有一个例子:

    对于点对:

    (tile0, point0)
    (tile0, point1)
    (tile1, point1)
    (tile1, point2)
    
    对于线对:

    (tile0, line0)
    (tile0, line1)
    (tile1, line2)
    (tile1, line3)
    
    我想要的是:

    对于磁贴0:

     (tile0, point0:line0)
     (tile0, point0:line1)
     (tile0, point1:line0)
     (tile0, point1:line1)
    
    对于地砖1:

     (tile1, point1:line2)
     (tile1, point1:line3)
     (tile1, point2:line2)
     (tile1, point2:line3)
    

    使用将标题输出为关键帧、点/线输出为值的映射器。必须区分点输出值和线输出值。例如,您可以使用一个特殊字符(即使二进制方法会更好)

    因此,贴图输出将类似于:

     tile0, _point0
     tile1, _point0
     tile2, _point1 
     ...
     tileX, *lineL
     tileY, *lineK
     ...
    
    然后,在减速器处,您的输入将具有以下结构:

     tileX, [*lineK, ... , _pointP, ...., *lineM, ..., _pointR]
    
    你必须把点和线分开,做一个叉积,然后输出每对叉积,如下所示:

    tileX (lineK, pointP)
    tileX (lineK, pointR)
    ...
    
    如果您已经可以轻松区分点值和线值(取决于您的应用程序规范),则不需要特殊字符(*,\)

    关于在减速器中必须进行的叉积: 首先遍历整个值列表,将它们分为两个列表:

     List<String> points;
     List<String> lines;
    

    所以这里基本上有两个选择:减少边连接或映射边连接

    这里您的组密钥是“平铺”。在单个减速器中,您将获得点对和线对的所有输出。但必须在阵列中缓存点对或线对。如果其中一对(点或线)非常大,都无法放入单个组键(每个唯一磁贴)的临时阵列内存中,则此方法将不适用于您。请记住您不必在内存中同时保留单个组键(“平铺”)的两个键对,一个就足够了


    如果单个组密钥的两个密钥对都较大,则必须尝试映射侧连接。但它有一些特殊的要求。但是,您可以通过一些map/reduce作业对数据进行预处理来满足这些要求,这些作业为两个数据运行相同数量的reducer

    太好了。但是我应该如何做reduce部分中的叉积呢?很好,但是只有当你能将所有的点/线放入内存,以便将它们存储在上面提到的两个列表中时,这才有效。恐怕我的大型数据集并非如此:(这篇文章很老,但因为我有一个问题非常类似于这篇文章,所以在这里发布。有人能在这里提供代码示例,说明如何以map/reduce格式执行此操作。我正在尝试理解和学习此内容。感谢advance@reza您是否已经为大型数据集找到了上述解决方案??
    tile(current key), element_of_the_resulting_cross_product_list