博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Sample Join Analysis
阅读量:4983 次
发布时间:2019-06-12

本文共 2196 字,大约阅读时间需要 7 分钟。

Sample data: student.txt

1,yaoshuya,25

2,yaoxiaohua,29
3,yaoyuanyie,15
4,yaoshupei,26

Sample data:score.txt

1,yuwen,100

1,shuxue,99
2,yuwen,99
2,shuxue,88
3,yuwen,99
3,shuxue,56
4,yuwen,33
4,shuxue,99

输出文件内容:

1    [yaoshuya,25,yuwen,100]

1    [yaoshuya,25,shuxue,99]
2    [yaoxiaohua,29,yuwen,99]
2    [yaoxiaohua,29,shuxue,88]
3    [yaoyuanyie,15,yuwen,99]
3    [yaoyuanyie,15,shuxue,56]
4    [yaoshupei,26,yuwen,33]
4    [yaoshupei,26,shuxue,99]

参数:

args= "-Dio.sort.mb=10

-r 1

-inFormat org.apache.hadoop.mapred.KeyValueTextInputFormat

-outFormat org.apache.hadoop.mapred.TextOutputFormat

-outKey org.apache.hadoop.io.Text

-outValue org.apache.hadoop.mapred.join.TupleWritable

hdfs://namenode:9000/user/hadoop/student/student.txt

hdfs://namenode:9000/user/hadoop/student/score2.txt

hdfs://namenode:9000/user/hadoop/joinout".split(" ");

需要注意的是我使用的输出格式是TextOutputFormat(完全是为了方便观察输出后的数据)

输出的valuetype是org.apache.hadoop.mapred.join.TupleWritable ,这个 类型非常方便,类似于数组类型,可以接受多值。

在源码中添加的一句代码,是用来配置我的数据源文件的keyvalue分隔符是,(comma).

jobConf.set("key.value.separator.in.input.line", ",");

关键代码简析:

job.setInputFormatClass(CompositeInputFormat.class);

job.getConfiguration().set(CompositeInputFormat.JOIN_EXPR,
      CompositeInputFormat.compose(op, inputFormatClass,
      plist.toArray(new Path[0])));

使用CompositeInputFormat来进行join操作。此类的说明:

/**

* An InputFormat capable of performing joins over a set of data sources sorted
* and partitioned the same way.
*
* A user may define new join types by setting the property
* <tt>mapreduce.join.define.&lt;ident&gt;</tt> to a classname.
* In the expression <tt>mapreduce.join.expr</tt>, the identifier will be
* assumed to be a ComposableRecordReader.
* <tt>mapreduce.join.keycomparator</tt> can be a classname used to compare
* keys in the join.
* @see #setFormat
* @see JoinRecordReader
* @see MultiFilterRecordReader
*/

通过op来指定连接类型:inner,outer,tbl等,有其他需要也可以实现。

具体是怎么连接的呢?根据两个source进入mapper的key进行归并连接。所以要求数据源是根据key值有序的。此连接是在map端实现的。

测试中我使用KeyValueTextInputFormat来处理,其默认格式是key\tValue,所以我使用了上面的代码来进行重置这个格式。但如果你的文件不是key放在第一个位置,你就需要自己写FileInputFormat啦。

但明显需要你要处理的数据源都是使用同样的FileInputFormat去读取。

还有一点,这里支持多文件连接,示例中我只使用了两个示例文件,可以添加更多的文件,路径添加到outputdir之前即可。

转载于:https://www.cnblogs.com/huaxiaoyao/p/4298131.html

你可能感兴趣的文章
struts2标签
查看>>
51nod1247(gcd)
查看>>
大数据技能学习
查看>>
day 53 练习
查看>>
【leetcode】Word Break II
查看>>
Substring with Concatenation of All Words
查看>>
云来储存型XSS漏洞+越权修改应用封面
查看>>
手势 - 单击、长按、拖动等
查看>>
【离线做法】可持久化的书橱
查看>>
Mac 启用http-dav功能(WebDAV服务器)
查看>>
T4 多文件生成说明
查看>>
linux7 安装SVN
查看>>
咳 第一次作业(实验体)
查看>>
[python]Mongodb
查看>>
octotree神器 For Github and GitLab 火狐插件
查看>>
Loj 6285. 数列分块入门 9
查看>>
7.9 动态规划——摆花
查看>>
题解 P4949 【最短距离】
查看>>
BZOJ 1592: [Usaco2008 Feb]Making the Grade 路面修整
查看>>
整体二分 HDU - 5808
查看>>