详解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 如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!