使用MapReduce写入数据到hbase的多个表中

   使用MultiTableOutputFormat这个类:s
package test;

import java.io.IOException;
import java.util.UUID;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.io.ImmutableBytesWritable;
import org.apache.hadoop.hbase.mapreduce.MultiTableOutputFormat;
import org.apache.hadoop.hbase.util.Bytes;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.util.GenericOptionsParser;



public class MultiTableImport {
       public static class MultiTableImportMapper extends Mapper<LongWritable, Text, Text, LongWritable>{
        private LongWritable count=new LongWritable(1);
        private Text text=new Text();
        private String daytime="";
		@Override
		protected void map(LongWritable key, Text value, Context context)
				throws IOException, InterruptedException {
			    String line=value.toString();
			    String[] lineSplits=line.split(",");
			    if(lineSplits.length!=13){
			    	return;
			    }
			    if(lineSplits.length<0 || lineSplits.length!=13){
			    	return;
			    }
			    //过滤没有车牌号的数据
			    String plateNumber=lineSplits[2];
			    if(null==plateNumber || "".equals(plateNumber)){
			    	return;
			    }
			    //过滤车牌号中不为京的车牌
//			    if(plateNumber.contains("冀") || plateNumber.contains("玉") || plateNumber.contains("使") || plateNumber.contains("密")){
//			    	return;
//			    }
			    if(!plateNumber.startsWith("京")){
			    	return;
			    }
			    
			    //过滤时间不正确的数据
			    String gpsTime=lineSplits[3];
			   
			    if(null ==gpsTime || "".equals(gpsTime)){
			        return;
			    }else{
			    	gpsTime=gpsTime.replace("-", "").replace(":", "").replace(" ", "");
			    	if(!gpsTime.startsWith(daytime)){
			    		return;
			    	}
			    }
			    String uuid=UUID.randomUUID().toString().replace("-", "");
			    String txt=uuid+","+line;
			    text.set(Bytes.toBytes(txt));
			    context.write(text, count);
		}
		@Override
		protected void setup(Context context)
				throws IOException, InterruptedException {
			   daytime=context.getConfiguration().get("daytime");
			   System.out.println("daytime="+daytime);
		}
    	 
		
       }
       
       public static class MultiTableImportReducer extends Reducer<Text, LongWritable, ImmutableBytesWritable,Put> {
    		private String[] columns=new String[]{"DATA_TYPE","TERMINAL_NUMBER","PLATE_NUMBER","GPS_TIME","LON","LAT","SPEED","VEHICLE_STATUS",
    		         "LOCATION_STATUS","AZIMUTHS","VEHICLE_TYPE","ALARM_STATUS","FIRE_STATUS"};
    		ImmutableBytesWritable write1=new ImmutableBytesWritable(Bytes.toBytes("BJ_GPS_DATA"));
    		//ImmutableBytesWritable write2=new ImmutableBytesWritable(Bytes.toBytes("GPS_INDEXPLATTIME_DATA"));
    		ImmutableBytesWritable write2=new ImmutableBytesWritable(Bytes.toBytes("GPS_INDEXPLATNUMBER_DATA"));
    		@Override
    		protected void reduce(Text key,
    				Iterable<LongWritable> values, Context context)
    				throws IOException, InterruptedException {
    			   String lineContent=key.toString();
    			   String[] splits=lineContent.split(",");
    			   if(splits.length!=14){
    				   return;
    			   }
    			  String uuid=splits[0];
    			  String time=splits[4].replace("-", "").replace(":", "").replace(" ", "");
    			  //写入第一个GPS表
    			  Put gpsPut=new Put(Bytes.toBytes(uuid));
    			  for (int i = 0; i < columns.length; i++) {
    				  if(i==3){
    					  gpsPut.add(Bytes.toBytes("F1"), Bytes.toBytes(columns[i]), Bytes.toBytes(time));
    				  }else{
    				  gpsPut.add(Bytes.toBytes("F1"), Bytes.toBytes(columns[i]), Bytes.toBytes(splits[i+1]));
    				  }
    		      }
    			  context.write(write1, gpsPut);
    			  //写入车牌时间索引表
    			  String platNum=splits[3];
//    			 byte[] prefix=TimeRegionPrefix.getRegionPrefix(Constants.INDEXPLATTIME, time); 
//  			    if(null==prefix || prefix.length==0){
//  			    	prefix = new byte[] { 126, 126 };
//  			    }
//  			    //构建车牌时间索引表的行键
//  			   
//  			    byte[] column = ArrayUtils.addAll(prefix, Bytes.toBytes(platNum));
//  				column = ArrayUtils.add(column, Constants.SPLITBYTE);
//  				column = ArrayUtils.addAll(column, Bytes.toBytes(time));
//  				column = ArrayUtils.add(column, Constants.SPLITBYTE);
//  				column = ArrayUtils.addAll(column, Bytes.toBytes(uuid));
    			String column=platNum+"|"+time;
  			    Put platTimePut=new Put(Bytes.toBytes(column));
  				platTimePut.add(Bytes.toBytes(Constants.FAMILY),Bytes.toBytes("C1"),Bytes.toBytes(""));
    		    context.write(write2, platTimePut);
    		
    	    }
    	} 
    	 
       public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
    	   Configuration conf=new Configuration();
	          conf.set("mapred.jar", "E:\\MultiTableImport.jar");
	          conf.set("daytime", args[0]);
	          Job job=new Job(conf, "MultiTableImport");
	          String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs();
	          if (otherArgs.length != 1) {
	            System.err.println("Usage: wordcount <in> <out>");
	            System.exit(2);
	          }
	          job.setJarByClass(MultiTableImport.class);
	          job.setMapperClass(MultiTableImportMapper.class);
	          job.setReducerClass(MultiTableImportReducer.class);
	          job.setMapOutputKeyClass(Text.class);
	          job.setMapOutputValueClass(LongWritable.class);
	          job.setNumReduceTasks(61);
	          ///test/datafile/GpsData/20140514/JKSX_20140514.CSV
	          FileInputFormat.setInputPaths(job, new Path("/test/datafile/GpsData/201404/"+args[0]));
	       //   TableMapReduceUtil.initTableReducerJob("BJ_GPS", ImportGpsReducer.class, job);
	          job.setOutputFormatClass(MultiTableOutputFormat.class);
	          job.setOutputKeyClass(ImmutableBytesWritable.class);
	          job.setOutputValueClass(Put.class);
	          boolean result=job.waitForCompletion(true);
	          System.out.println(result);
	}
    	 
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值