在介绍这个实例之前,请各位参考:http://bjyjtdj.iteye.com/blog/1453410。

reduce side join是一种最简单的join方式,其主要思想如下:
 在map阶段,map函数同时读取两个文件File1和File2,为了区分两种来源的key/value数据对,对每条数据打一个标签(tag),比如:tag=0表示来自文件File1,tag=2表示来自文件File2。即:map阶段的主要任务是对不同文件中的数据打标签。在reduce阶段,reduce函数获取key相同的来自File1和File2文件的value list, 然后对于同一个key,对File1和File2中的数据进行join(笛卡尔乘积)。即:reduce阶段进行实际的连接操作。在这个例子中我们假设有两个数据文件如下:

user.csv文件:

"ID","NAME","SEX"
"1","user1","0"
"2","user2","0"
"3","user3","0"
"4","user4","1"
"5","user5","0"
"6","user6","0"
"7","user7","1"
"8","user8","0"
"9","user9","0"

order.csv文件:

"USER_ID","NAME"
"1","order1"
"2","order2"
"3","order3"
"4","order4"
"7","order7"
"8","order8"
"9","order9"

目前网上的例子大多是基于0.20以前版本的API写的,所以咱们采用新的API来写,具体代码如下:


public class MyJoin
{public static class MapClass extends Mapper<LongWritable, Text, Text, Text>{//最好在map方法外定义变量,以减少map计算时创建对象的个数private Text key = new Text();private Text value = new Text();private String[] keyValue = null;@Overrideprotected void map(LongWritable key, Text value, Context context)throws IOException, InterruptedException{//采用的数据输入格式是TextInputFormat,//文件被分为一系列以换行或者制表符结束的行,//key是每一行的位置(偏移量,LongWritable类型),//value是每一行的内容,Text类型,所有我们要把key从value中解析出来keyValue = value.toString().split(",", 2);this.key.set(keyValue[0]);this.value.set(keyValue[1]);context.write(this.key, this.value);}}public static class Reduce extends Reducer<Text, Text, Text, Text>{//最好在reduce方法外定义变量,以减少reduce计算时创建对象的个数private Text value = new Text();@Overrideprotected void reduce(Text key, Iterable<Text> values, Context context)throws IOException, InterruptedException{StringBuilder valueStr = new StringBuilder();//values中的每一个值是不同数据文件中的具有相同key的值//即是map中输出的多个文件相同key的value值集合for(Text val : values){valueStr.append(val);valueStr.append(",");}this.value.set(valueStr.deleteCharAt(valueStr.length()-1).toString());context.write(key, this.value);}}public static void main(String[] args) throws Exception{Configuration conf = new Configuration();Job job = new Job(conf, "MyJoin");job.setJarByClass(MyJoin.class);job.setMapperClass(MapClass.class);job.setReducerClass(Reduce.class);//job.setCombinerClass(Reduce.class);job.setOutputKeyClass(Text.class);job.setOutputValueClass(Text.class);//分别采用TextInputFormat和TextOutputFormat作为数据的输入和输出格式//如果不设置,这也是Hadoop默认的操作方式job.setInputFormatClass(TextInputFormat.class);job.setOutputFormatClass(TextOutputFormat.class);FileInputFormat.addInputPath(job, new Path(args[0]));FileOutputFormat.setOutputPath(job, new Path(args[1]));System.exit(job.waitForCompletion(true) ? 0 : 1);}
}

转发:https://blog.csdn.net/huashetianzu/article/details/7819244

hadoop join相关推荐

  1. hadoop join之map side join

    在本例中,我们仍然采用上一例中的数据文件.之所以存在reduce side join,是因为在map阶段不能获取所有需要的join字段,即:同一个key对应的字段可能位于不同map中.Reduce s ...

  2. hadoop join之semi join

    SemiJoin,也叫半连接,是从分布式数据库中借鉴过来的方法.它的产生动机是:对于reduce side join,跨机器的数据传输量非常大,这成了join操作的一个瓶颈,如果能够在map端过滤掉不 ...

  3. Hadoop Join性能优化

    为什么要优化? 数据格式 address.txt 1    America 2    China 3    Germen number.txt 1    Spark    1 2    Hadoop  ...

  4. MapReduce 中的两表 join 几种方案简介

    1. 概述 在传统数据库(如:MYSQL)中,JOIN操作是非常常见且非常耗时的.而在HADOOP中进行JOIN操作,同样常见且耗时,由于Hadoop的独特设计思想,当进行JOIN操作时,有一些特殊的 ...

  5. 【大数据面试题】(一)Hadoop 相关面试题总结

    1.MapTask并行机度是由什么决定的? 由切片数量决定的. 2.MR是干什么的? MR将用户编写的业务逻辑代码和自带的默认组件结合起来组成一个完整的分布式应用程序放到hadoop集群上运行. 3. ...

  6. Impala/Hive现状分析与前景展望

    2019独角兽企业重金招聘Python工程师标准>>> Impala和Hive野史 提到Impala就不得不提Google的Dremel,处理PB级数据规模的基于SQL的交互式.实时 ...

  7. Impala/Hive现状分析与前景展望【转载】

    Impala和Hive野史 提到Impala就不得不提Google的Dremel,处理PB级数据规模的基于SQL的交互式.实时数据分析系统.Dremel是Google推出的PaaS数据分析服务BigQ ...

  8. 面向ad-hoc查询的实时SQL分析系统

    Impala/Hive现状分析与前景展望 Impala和Hive野史 提到Impala就不得不提Google的Dremel,处理PB级数据规模的基于SQL的交互式.实时数据分析系统.Dremel是Go ...

  9. PayPal高级工程总监:读完这100篇论文 就能成大数据高手

    PayPal高级工程总监:读完这100篇论文 就能成大数据高手 阅读目录 关键架构层(Key architecture layers) 架构的演进(Architecture Evolution) 文件 ...

最新文章

  1. 为NLP从业者/研究生/研究员专门定制的全网唯一高端NLP训练营
  2. matlab风力机叶片仿真教程,我用matlab编写了一个风力机叶片的优化设计程序,有点问题 - 程序语言 - 小木虫 - 学术 科研 互动社区...
  3. (Excel)常用函数公式及操作技巧之四:文本与页面设置(二)
  4. Eclipse如何调整字体大小
  5. 中班区域活动设计思路_【年段教研】“小游戏大学问 巧建构促发展” ——石狮实幼中班段年段教研主题建构游戏的组织与开展...
  6. 【QGIS入门实战精品教程】4.4:QGIS如何将点自动连成线、线生成多边形?
  7. 【CCCC】L2-013 红色警报 (25分),,并查集计算集合个数
  8. 用POP3获取邮箱邮件内容(完整C#源码)
  9. FPN网络结构及Pytorch实现
  10. 【贪心算法】哈夫曼编码问题
  11. DCT 离散余弦变换及蝶形算法
  12. php开源代码推荐,非常好用的源代码网站推荐,用这些开源代码就够了
  13. masked_fill_() - masked_fill() - v1.5.0
  14. 企业微信自动打卡插件开发
  15. 天问一号入轨火星成功,火星,我们来了!
  16. GitHub页面接管并利用
  17. 覃卫平java,湖南省职业教育“十一五”省级重点建设项目验收通过项目.doc
  18. 数据库可视化查询工具
  19. Altium Designer多图纸原理图关联设计方法
  20. 仿QQ弹出窗口 gggggggggggg

热门文章

  1. 实例1:python(续)
  2. Bash脚本报错:“/bin/bash^M: bad interpreter: No such file or directory”
  3. LwIP tcp/ip socket编程listen函数分析
  4. 程序员的数学笔记2--余数
  5. 剑指offer--旋转数组的最小数字
  6. tf.name_scope tf.variable_scope学习
  7. Effective C++: 06继承与面向对象设计
  8. 我是服务的执政官-服务发现和注册工具consul简介
  9. simplified build configuration
  10. call stack and stack buffer overflow