十八 Reduce Join

1 Reduce Join工作原理

Map端的主要工作:为来自不同表或文件的key/value对,打标签以区别不同来源的记录。然后用连接字段作为key,其余部分和新加的标志作为value,最后进行输出。
Reduce端的主要工作:在Reduce端以连接字段作为key的分组已经完成,我们只需要在每一个分组当中将那些来源于不同文件的记录(在Map阶段已经打标志)分开,最后进行合并就ok了。

2 实例

1.需求

id pid amount
1001 01 1
1002 02 2
1003 03 3
1004 01 4
1005 02 5
1006 03 6
pid pname
01 小米
02 华为
03 格力

将商品信息表中数据根据商品pid合并到订单数据表中。

id pname amount
1001 小米 1
1004 小米 4
1002 华为 2
1005 华为 5
1003 格力 3
1006 格力 6

2.需求分析
通过将关联条件作为Map输出的key,将两表满足Join条件的数据并携带数据所来源的文件信息,发往同一个ReduceTask,在Reduce中进行数据的串联.

思路:
把两个文件全部读到map,并且封装到结构体中,使用二次排序,先排pid,如果pid相同,把有名字的排在最前面,通过pid分组,如果pid一样分到同一个组内,组内来自商品的数据排在第一行,然后遍历后面的数据,把第一行的pname join到后面的数据中.

  1. 代码
    ReduceDriver 类
package com.reducejoin;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;

import java.io.IOException;

/**
 * @author andy
 * @version 1.0
 * @date 2020/3/3 0:44
 * @contact [email protected]
 * @since JDK 1.8
 */
public class ReduceDriver {
   
    public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
   
        if (args == null || args.length < 2)
            args = new String[]{
   "E:\\temp\\input\\reducejoin", "E:\\temp\\output"};
        Path path = new Path(args[1]);
        Configuration conf = new Configuration();
        FileSystem fs = path.getFileSystem(conf);
        Job job = Job.getInstance(conf);


        try {
   
            if (fs.exists(path))
                fs.delete(path, true);
        } catch (IllegalArgumentException e) {
   
            e.printStackTrace();
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: MapjoinReducejoin是两种用于在Hadoop MapReduce中进行数据连接的方法。 Mapjoin是将小表加载到内存中,在map阶段进行连接,不需要在reduce阶段进行连接。这种方法适用于小表和大表的连接。 Reducejoin则是在reduce阶段进行连接,适用于两个大表的连接。 ### 回答2: MapReduce是一种分布式计算模型,用于在大规模数据集上进行并行计算。在MapReduce模型中,Map和Reduce是两个重要的阶段,其中Map阶段将数据分片并进行预处理,Reduce阶段将Map阶段的输出结果进行合并,并最终输出计算结果。 在MapReduce中,MapJoinReduceJoin是两个比较常见的数据处理方式。MapJoin是指在Map阶段中使用数据缓存或索引的方法将两个或多个数据集进行连接操作。而ReduceJoin则是在Reduce阶段中将两个或多个数据集进行连接操作。 MapJoinReduceJoin的区别在于它们的适用场景和性能表现。MapJoin通常用于一对一或者多对一的数据连接操作,适用于大数据集和小数据集的快速连接。由于MapJoin在Map阶段中进行连接操作,因此可以利用数据缓存或索引的优势,避免在Reduce阶段中进行大量的数据读写操作,从而提高了数据处理的效率和性能。 而ReduceJoin则适用于大数据集和大数据集之间的连接操作。由于Reduce阶段中涉及到大量的数据读写操作,因此需要在集群中进行大量的数据传输和复制,这会造成大量的网络和IO开销,从而导致性能下降。同时,ReduceJoin还需要进行数据的排序和分组操作,这会对集群的计算能力和内存压力造成很大的负担。 因此,MapJoinReduceJoin需要根据实际的数据规模和连接需求进行选择,以最优的方式进行数据处理和计算。在实际的MapReduce应用中,可以根据不同的业务特点和数据分布情况,选择适合自己的连接方式,以提高数据处理的效率和性能。 ### 回答3: MapJoinReduceJoinHadoop中两种常见的连接机制。MapJoin通常用于小数据集之间的连接,而ReduceJoin则适用于大数据集之间的连接。下面具体说明两者的区别: 1. MapJoin MapJoin是通过将两个表的数据都读入内存中,在Map端将这些数据进行连接,然后返回给Reduce端。在MapJoin中,一个表的数据作为Map输入,另一个表则存储在内存中作为Hash表,Map会对所有的数据进行扫描和匹配,最后将结果输出到Reduce端。由于MapJoin需要将所有数据全放在内存中,因此常用于小数据量的表之间的连接关系。 2. ReduceJoin ReduceJoin则是将两个表的数据集分别发送到Map端,Map端会对这两个数据集进行排序,然后对相同的Key进行匹配和连接,最后将结果返回给Reduce端。在ReduceJoin中,两个输入的数据集会被排序,相同的Key会被发送到同一个Reducer中进行操作,并将结果输出到Reduce端。ReduceJoin常用于大数据集之间的连接关系,因为它可以避免内存溢出的问题,但是需要进行排序和数据再次传输等过程,因此效率相对MapJoin会低一些。 综上所述,MapJoinReduceJoin都是链接两个数据集的机制,但是它们有着不同的使用场景。MapJoin适用于小数据集之间的连接,能够提供高效的连接性能;而ReduceJoin则适用于大数据集之间的连接,能够避免内存不足的问题,但是需要付出排序和数据传输等成本。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值