一、Reduce Join

1.概述

  • Map端的工作:打标签以区别不同来源的记录,然后使用连接字段作为key,其余部分和新加的标签作为value,最后输出到Reduce端
  • Reduce端的工作:来自Map端的数据具有相同的连接字段key,根据标签将来自不同文件的记录分开为两份或多份,在将这多份记录进行合并

    2.具体实现

  1. 按照读取数据的特点选择InputFormat
  2. 在setUp()方法内获取文件名

    1. @Override
    2. protected void setup(Context context) throws IOException, InterruptedException {
    3. FileSplit fileSplit = (FileSplit) context.getInputSplit();
    4. fileName = fileSplit.getPath().getName();
    5. }
  3. 将获取到的数据中除连接字段外的字段封装进Bean对象,并添加标记位(文件名)

  4. 将连接字段作为key,Bean对象作为value输出
  5. reduce阶段将来自不同文件的Bean对象进行拆分
  6. 合并数据并输出

    二、Map Join

    1.概述

  • 适用于大表join小表的操作
  • 无Reduce阶段

    2.具体实现

  1. 加载缓存数据

    1. job.addCacheFile(new URI("file://path/path/file.txt"))
  2. 设置reduce数量为0

  3. setUp方法操作缓存
    1. 获取缓存文件
    2. 循环读缓存的每一行
    3. 分割
    4. 缓存数据到集合(通常用hashmap,连接字段做key)
  4. map方法合并
    1. 合并(根据连接字段查找对象)
    2. 输出