六 连接模式 1) 连接简介

可以借用 SQL 的连接来解释

假设 表A、表B
内连接: A.name = B.name   保存共有的相同值属性
外连接:
    左外连接:
               以 外键表A(左)属性为基准。  包含A 属性整列。B属性符合A属性值的存入,其余B属性被置为 null。
    右外连接:
               以 外键表B(右)属性为基准。  包含B 属性整列。B属性符合A属性值的存入,其余A属性被置为 null。
    全连接:
               A、B 属性整列包含。 符合条件置入同一行 不符合的都置为 null 
反连接:
    全连接 - 内连接的结果。 也就是最终只包含 两表外键都不匹配的值
笛卡尔积
     (叉乘—— 返回行数等于两个表行数的乘积) 用一个表中的每一条记录匹配另外一个表中的每一条记录


reduce 端连接:
        reduce 端连接模式通过某个外键将多个大数据集连接起来。
        reduce 端连接通常需要消耗大量的网络带宽,且如果所有数据及都非常大(其中任何一个都不可以放入一个内存中时),reduce 端连接可能成为唯一选择。

适用场景:
        多个大数据集需要按一个外键做连接操作。 (如果除了一个数据集以外其他所有的数据集都可以放入内存,可以尝试复制连接。)
        需要灵活的执行任意类型的连接操作。
结构:
        mapper  为连接操作做准备工作:读取每个数据集中的记录的外键作为 K整条记录作为 V, 同时输出V 通过一个数据集的唯一表示 例如A、B。
        可以选择散列的 partitioner 。或者创建自定义 partitioner 来讲发送到 reduce 端的数据更为均匀
        reducer 通过手机每个输入分组的值并存入一个临时列表来执行需要的连接操作。分区:如:A 连接的记录存在A 列表,B连接的记录存在B列表。然后迭代选择两个集合的记录操作。 内连接只有两边记录都不为空才有结果输出,外连接空列表同样可以与非空列表做连接,对于非空列表则直接输出空可写对象即可。
结果:
        输出的 part 结果文件的数目 取决于 reduce 任务数。 如果是外连接或者反连接,那么很多列可能是 null。
性能:
        一个 reduce 端连接会给集群网络带来很大压力, 抽取每一条数据外键跟这条数据一起发送到 reduce, 且发送之前不会对数据过滤,所以所有数据都会被发送到混排和 排序阶段。 如果不包含笛卡尔积的方式 这种方式还是可以
    
reduce 端连接示例:
        如 用户表, 评论表作为输入数据。  使用 reduce 端连接将 ID 作为外键关联。  (内连接、外连接、反连接)

        Mapper 码 :需要用到 Hadoop 多路径输入、每个表单独创建一个 Mapper 剔除 不必要属性。(Mapper是此模式优化的一个地方。)
            注: 每个 mapper 类的输出类型必须一致
            V 中前置字母区分数据表、   
                    outValue.set("A"+ value.toString());
        Reduce 码 : 将每组所有值复制到内存, 并区分那条记录是来自哪个数据集的。然后所有记录被连接起来输出。

注意点:
        确保有合适的字段分隔符,当输出一个空文本是不明智的。应该生成一条包含合适结构但带有空字段的记录。而不是只输出一个对象。这样能确保后续分析的正确解析

以下是代码部分。  举例内连接、左外连接、 反连接。



reduce 主体:
         
内连接:

左外连接:
全外连接:
反外连接:
    书上的有问题,   反外连接求法是在内连接基础上,  遍历 A 如果 A = B出现。不 add 入这个集合。 然后在遍历 B  如果 B=A  出现 不记录这个集合即可。









posted @ 2016-04-25 09:29  rocky_24  阅读(215)  评论(0编辑  收藏  举报
希望祖国繁荣,富强! God has given me a gift. Only one. I am the most complete fighter in the world. My whole life, I have trained. I must prove I am worthy of someting. rocky_24