MapReduce 多表连接

题目描述:
现在有两个文件,1为存放公司名字和城市ID,2为存放城市ID和城市名
表一:
factoryname,addressed
Beijing Red Star,1
Shenzhen Thunder,3
Guangzhou Honda,2
Beijing Rising,1
Guangzhou Development Bank,2
Tencent,3
Back of Beijing,1
 
表2:
1,Beijing
2,Guangzhou
3,Shenzhen
4,Xian
 
现在要求输出公司名和城市名。例如:
Beijing Red Star Beijing
 
这个类似数据库里的多表连接。整体思路和单表连接差不多。还是利用reduce阶段对城市ID进行归并,我们在map阶段统一输出key=城市ID value=falg+“+”+城市名or公司名。然后通过reduce对flag的解析,分析后者是城市名还是公司名,并放到两个数组中,最后利用笛卡尔积将其输出
具体代码
public  class  MyMapper  extends  Mapper<LongWritable, Text, Text, Text> {
 
                  public  void  map(LongWritable ikey, Text ivalue, Context context )
                                                  throws  IOException, InterruptedException {
                                String line=ivalue.toString();
                                StringTokenizer st=  new  StringTokenizer(line, ","  );
                                String value0=st.nextToken();
                                String value1=st.nextToken();
                                  if (value0.compareTo( "factoryname"  )!=0){
                                                  if (value0.length()==1){
                                                                 context.write( new  Text(value0),  new  Text( "1"  + "+" +value1));
                                                }  else {
                                                                 context.write( new  Text(value1),  new  Text( "2"  + "+" +value0));
                                                }
                                }
                }
 
}
 
 
public  class  MyReducer  extends  Reducer<Text, Text, Text, Text> {
 
                  public  void  reduce(Text _key, Iterable<Text> values, Context context)
                                                  throws  IOException, InterruptedException {
                                  // process values
                                ArrayList<String> address=  new  ArrayList<String>();
                                ArrayList<String> factory=  new  ArrayList<String>();
                                  for  (Text val : values) {
                                                String line=val.toString();
                                                StringTokenizer st= new  StringTokenizer(line, "+"  );
                                                  int  flag=Integer.parseInt(st.nextToken());
                                                  if (flag==1){
                                                                String addressname=st.nextToken();
                                                                 address.add(addressname);
                                                                
                                                                
                                                }  else  if  (flag==2){
                                                                String factoryname=st.nextToken();
                                                                factory.add(factoryname);
                                                }
                                }
                                  if (address.size()!=0&&factory.size()!=0){
                                                  for ( int  i=0;i<address.size();i++){
                                                                  for ( int  j=0;j<factory.size();j++){
                                                                                context.write(  new  Text(address.get(i)), new  Text(factory.get(j)));
                                                                }
                                                }
                                }
                }
 
}

转载于:https://www.cnblogs.com/sunrye/p/4543359.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值