详解HDFS多文件Join操作的实例
详解HDFS多文件Join操作的实例
最近在做HDFS文件处理之时,遇到了多文件Join操作,其中包括:AllJoin以及常用的LeftJoin操作,
下面是个简单的例子;采用两个表来做leftjoin其中数据结构如下:
A文件:
a|1b|2|c
B文件:
a|b|1|2|c
即:A文件中的第一、二列与B文件中的第一、三列对应;类似数据库中Table的主键/外键
代码如下:
importjava.io.DataInput;
importjava.io.DataOutput;
importjava.io.IOException;
importjava.util.HashMap;
importjava.util.Map;
importorg.apache.hadoop.conf.Configuration;
importorg.apache.hadoop.conf.Configured;
importorg.apache.hadoop.contrib.utils.join.DataJoinMapperBase;
importorg.apache.hadoop.contrib.utils.join.DataJoinReducerBase;
importorg.apache.hadoop.contrib.utils.join.TaggedMapOutput;
importorg.apache.hadoop.fs.Path;
importorg.apache.hadoop.io.Text;
importorg.apache.hadoop.io.Writable;
importorg.apache.hadoop.mapred.FileInputFormat;
importorg.apache.hadoop.mapred.FileOutputFormat;
importorg.apache.hadoop.mapred.JobClient;
importorg.apache.hadoop.mapred.JobConf;
importorg.apache.hadoop.mapred.TextInputFormat;
importorg.apache.hadoop.mapred.TextOutputFormat;
importorg.apache.hadoop.util.ReflectionUtils;
importorg.apache.hadoop.util.Tool;
importorg.apache.hadoop.util.ToolRunner;
importcn.eshore.traffic.hadoop.util.CommUtil;
importcn.eshore.traffic.hadoop.util.StringUtil;
/**
*@ClassName:DataJoin
*@Description:HDFSJOIN操作
*@authorhadoop
*@date2012-12-18下午5:51:32
*/
publicclassInstallJoinextendsConfiguredimplementsTool{
privateStringstaticenSplitCode="\\|";
privateStringstaticsplitCode="|";
//自定义Reducer
publicstaticclassReduceClassextendsDataJoinReducerBase{
@Override
protectedTaggedMapOutputcombine(Object[]tags,Object[]values){
StringjoinedStr="";
//该段判断用户生成Leftjoin限制【其中tags表示文件的路径,install表示文件名称前缀】
//去掉则为AllJoin
if(tags.length==1&&tags[0].toString().contains("install")){
returnnull;
}
Mapmap=newHashMap();
for(inti=0;i
如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!