mapreduce编程模型之hbase表作为数据源输入输出

  1. package cn.luxh.app;  
  2.   
  3. import java.io.IOException;  
  4. import java.util.StringTokenizer;  
  5.   
  6. import org.apache.hadoop.conf.Configuration;  
  7. import org.apache.hadoop.hbase.HBaseConfiguration;  
  8. import org.apache.hadoop.hbase.client.Put;  
  9. import org.apache.hadoop.hbase.client.Result;  
  10. import org.apache.hadoop.hbase.client.Scan;  
  11. import org.apache.hadoop.hbase.io.ImmutableBytesWritable;  
  12. import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;  
  13. import org.apache.hadoop.hbase.mapreduce.TableMapper;  
  14. import org.apache.hadoop.hbase.mapreduce.TableReducer;  
  15. import org.apache.hadoop.hbase.util.Bytes;  
  16. import org.apache.hadoop.io.IntWritable;  
  17. import org.apache.hadoop.io.Text;  
  18. import org.apache.hadoop.mapreduce.Job;  
  19.   
  20.   
  21. /** 
  22.  * @author Luxh 
  23.  * 
  24.  */  
  25. public class WordStat {  
  26.       
  27.     /** 
  28.      * TableMapper<Text,IntWritable>  Text:输出的key类型,IntWritable:输出的value类型 
  29.      */  
  30.     public static class MyMapper extends TableMapper<Text,IntWritable>{  
  31.           
  32.         private static IntWritable one = new IntWritable(1);  
  33.         private static Text word = new Text();  
  34.           
  35.         @Override  
  36.         protected void map(ImmutableBytesWritable key, Result value,  
  37.                 Context context)  
  38.                 throws IOException, InterruptedException {  
  39.             //表里面只有一个列族,所以我就直接获取每一行的值  
  40.             String words = Bytes.toString(value.list().get(0).getValue());  
  41.             StringTokenizer st = new StringTokenizer(words);   
  42.             while (st.hasMoreTokens()) {  
  43.                  String s = st.nextToken();  
  44.                  word.set(s);  
  45.                  context.write(word, one);  
  46.             }  
  47.         }  
  48.     }  
  49.       
  50.     /** 
  51.      * TableReducer<Text,IntWritable>  Text:输入的key类型,IntWritable:输入的value类型,ImmutableBytesWritable:输出类型 
  52.      */  
  53.     public static class MyReducer extends TableReducer<Text,IntWritable,ImmutableBytesWritable>{  
  54.           
  55.         @Override  
  56.         protected void reduce(Text key, Iterable<IntWritable> values,  
  57.                 Context context)  
  58.                 throws IOException, InterruptedException {  
  59.               
  60.             int sum = 0;  
  61.             for(IntWritable val:values) {  
  62.                 sum+=val.get();  
  63.             }  
  64.             //添加一行记录,每一个单词作为行键  
  65.             Put put = new Put(Bytes.toBytes(key.toString()));  
  66.             //在列族result中添加一个标识符num,赋值为每个单词出现的次数  
  67.             //String.valueOf(sum)先将数字转化为字符串,否则存到数据库后会变成\x00\x00\x00\x这种形式  
  68.             //然后再转二进制存到hbase。  
  69.             put.add(Bytes.toBytes("result"), Bytes.toBytes("num"), Bytes.toBytes(String.valueOf(sum)));  
  70.             context.write(new ImmutableBytesWritable(Bytes.toBytes(key.toString())),put);  
  71.         }  
  72.     }  
  73.       
  74.     public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {  
  75.           
  76.         Configuration conf = HBaseConfiguration.create();  
  77.         Job job = new Job(conf,"wordstat");  
  78.         job.setJarByClass(Blog.class);  
  79.           
  80.           
  81.         Scan scan = new Scan();  
  82.         //指定要查询的列族  
  83.         scan.addColumn(Bytes.toBytes("content"),null);  
  84.         //指定Mapper读取的表为word  
  85.         TableMapReduceUtil.initTableMapperJob("word", scan, MyMapper.class, Text.class, IntWritable.class, job);  
  86.      //指定Reducer写入的表为stat  
  87.         TableMapReduceUtil.initTableReducerJob("stat", MyReducer.class, job);  
  88.         System.exit(job.waitForCompletion(true)?0:1);  
  89.     }  
  90. }  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值