问题描述:两种类型输入文件:address(地址)和company(公司)进行一对多的关联查询,得到地址名(例如:Beijing)与公司名(例如:Beijing JD、Beijing Red Star)的关联信息。可参考MR案例:Map-Join

1.map阶段:对比之前的单表关联可知,reduce阶段的key必须为关联两表的key,即address.Id = company.Id。则两表经过map处理输出的key必须是Id。

  1. Class Map<LongWritable, Text, LongWritable, Text>{
  2. method map(){
  3.  
  4. // 获取文件的每一行数据,并以":"分割
  5. String[] line = value.toString().split(":");
  6.  
  7. //split对应的文件名
  8. String fileName = ((FileSplit) context.getInputSplit()).getPath().getName();
  9.  
  10. //处理company文件的value信息:"Beijing Red Star:1"
  11. if (path.indexOf("company") >= 0){
  12.  
  13. //<key,value> --<"1","company:Beijing Red Star">
  14. context.write(new LongWritable(line[1]), new Text("company" + ":" + line[0]));
  15. }
  16. //处理adress文件的value信息:"1:Beijing"
  17. else if (path.indexOf("address") >= 0){
  18.  
  19. //<key,value> --<"1","address:Beijing">
  20. context.write(new LongWritable(line[0]), new Text("address" + ":" + line[1]));
  21. }
  22. }
  23. }

2.reduce阶段:首先对输入<key, values>即<”1”,[“company:Beijing Red Star”,”company:Beijing JD”,”address:Beijing”]>的values值进行遍历获取到单元信息value(例如”company:Beijing Red Star”),然后根据value中的标识符(company和address)将公司名和地址名分别存入到company集合和address集合,最后对company集合和address集合进行笛卡尔积运算得到company与address的关系,并进行输出。

  1. Class Reducer<LongWritable, Text, Text, Text>{
  2. method reduce(){
  3.  
  4. //用来存储 company 和 address 的集合
  5. List<String> companys = new ArrayList<String>();
  6. List<String> addresses = new ArrayList<String>();
  7.  
  8. for(Text text : v2s){
  9. String[] result = text.toString().split(":");
  10.  
  11. //以 company 开头的value存储到 company 集合中
  12. if(result[0].equals("company")){
  13. companys.add(result[1]);
  14. }
  15. //以 address 开头的value存储到 address 集合中
  16. else if(result[0].equals("address")){
  17. addresses.add(result[1]);
  18. }
  19. }
    /**
    * 如果只判断左表addresses.size()!=0;则转化为 左外连接 --> LEFT OUTER JOIN
    * 如果只判断右表companys.size()!=0;则转化为 右外连接 --> RIGHT OUTER JOIN
    * 左右都不判断,则转化为 全外连接 --> FULL OUTER JOIN
    */
  20. // 求笛卡尔积
  21. if(0 != companys.size()&& 0 != addresses.size()){
  22. for(int i=0;i<companys.size();i++){
  23. for(int j=0;j<addresses.size();j++){
  24.  
  25. //<key,value>--<"Beijing JD","Beijing">
  26. context.write(new Text(companys.get(i)), new Text(addresses.get(j)));
  27. }
  28. }
  29. }
  30. }
  31. } 

MR案例:Reduce-Join的更多相关文章

  1. Hadoop学习之路(二十一)MapReduce实现Reduce Join(多个文件联合查询)

    MapReduce Join 对两份数据data1和data2进行关键词连接是一个很通用的问题,如果数据量比较小,可以在内存中完成连接. 如果数据量比较大,在内存进行连接操会发生OOM.mapredu ...

  2. MR案例:倒排索引

    1.map阶段:将单词和URI组成Key值(如“MapReduce :1.txt”),将词频作为value. 利用MR框架自带的Map端排序,将同一文档的相同单词的词频组成列表,传递给Combine过 ...

  3. MapReduce编程之Reduce Join多种应用场景与使用

    在关系型数据库中 Join 是非常常见的操作,各种优化手段已经到了极致.在海量数据的环境下,不可避免的也会碰到这种类型的需求, 例如在数据分析时需要连接从不同的数据源中获取到数据.不同于传统的单机模式 ...

  4. MR案例:小文件处理方案

    HDFS被设计来存储大文件,而有时候会有大量的小文件生成,造成NameNode资源的浪费,同时也影响MapReduce的处理效率.有哪些方案可以合并这些小文件,或者提高处理小文件的效率呢? 1). 所 ...

  5. MapReduce之Reduce Join

    一 介绍 Reduce Join其主要思想如下: 在map阶段,map函数同时读取两个文件File1和File2,为了区分两种来源的key/value数据对,对每条数据打一个标签(tag), 比如:t ...

  6. MR案例:CombineFileInputFormat

    CombineFileInputFormat是一个抽象类.Hadoop提供了两个实现类CombineTextInputFormat和CombineSequenceFileInputFormat. 此案 ...

  7. MR案例:倒排索引 && MultipleInputs

    本案例采用 MultipleInputs类 实现多路径输入的倒排索引.解读:MR多路径输入 package test0820; import java.io.IOException; import j ...

  8. MR案例:输出/输入SequenceFile

    SequenceFile文件是Hadoop用来存储二进制形式的key-value对而设计的一种平面文件(Flat File).在SequenceFile文件中,每一个key-value对被看做是一条记 ...

  9. MR案例:外连接代码实现

    [外连接]是在[内连接]的基础上稍微修改即可.具体HQL语句详见Hive查询Join package join.map; import java.io.IOException; import java ...

随机推荐

  1. Ubuntu下载及安装

    Ubuntu(友帮拓.优般图.乌班图)是一个以桌面应用为主的开源GNU/Linux操作系统,Ubuntu 是基于DebianGNU/Linux,支持x86.amd64(即x64)和ppc架构,由全球化 ...

  2. Python可视化Matplotlib-K线图

    引入类库 import matplotlib as mpl import tushare as ts import matplotlib.pyplot as plt import matplotlib ...

  3. 5.2 - ToDoList

    一.ToDoList需求 参考链接http://www.todolist.cn/ 1.将用户输入添加至待办项 2.可以对todolist进行分类(待办项和已完成组),用户勾选既将待办项分入已完成组 3 ...

  4. Preparing Olympiad---cf550B(DFS或者状态压缩模板)

    比赛链接:http://codeforces.com/problemset/problem/550/B 给你n个数,选出来只是2个然后求他们的和在L和R的区间内,并且选出来的数中最大值和最小值的差不得 ...

  5. CMDB实现的四种方式

    第一种(agent): 这种方式是通过向每一台服务器安装agent脚本,然后通过中控机的API,来收集所需要的数据,最后放到数据库中,在通过web的方式显示出来. 实现流程图: 1.录入资产(主机名, ...

  6. Spring boot 打包瘦身方法

    背景 随着spring boot 的流行.越来越多的来发着选择使用spring boot 来发 web 应用. 不同于传统的 web 应用 需要 war 包来发布应用. spring boot 应用可 ...

  7. 转Hibernate 一对多关联的CRUD__@ManyToOne(cascade=(CascadeType.ALL))

    一:Group和Users两个类 假定一个组里有n多用户,但是一个用户只对应一个用户组. 1.所以Group对于Users是“一对多”的关联关系@OneToMany Users对于Group是“多对一 ...

  8. IntBuffer类的基本用法

    package com.ietree.basicskill.socket.basic.nio; import java.nio.IntBuffer; /** * Created by Administ ...

  9. robotFramework_ride_python2_Wxpython测试环境搭建

    (提示:我的安装版本是robotFramework3.0+ride1.5+python2.7+wxpython2.8,至于wxpython3.0下ride安装打不开的问题我还没找到原因,建议刚开始先不 ...

  10. Django小练习

    1.获取系统所有Url from django.urls.resolvers import RegexURLPattern #定义函数 def get_all_url(patterns, prev, ...