使用MapReduce的分层抽样

本篇文章讲述了使用MapReduce进行分层抽样。对于数据量实在太大,并且使用hadoop分布式管理系统的小朋友,如何进行数据分析呢?大家应该要知道,很多统计理论都是针对中小样本的,那么抽样,就成了大数据分析平台下必要的工作了。

假设这是一个存在HDFS中的关于客户信息的文件:

姓名 ,年纪,性别,职位,购买商品,单价

张三,20,男,操作工,商品一,32元

李四,30,女,务农,商品二,56元

那么我们分别想从性别为男的客户中抽取大约10%的男性客户,从性别为女的客户中抽取大约20%的女性客户,但由于数据量实在太大,无法全部将文件读取到内存中,那么用一个简单的mapreduce程序,只需要写一个map函数,则可以轻松解决这个问题。不说了,直接上代码。

import java.io.IOException;
import java.util.Random;
 
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.log4j.Logger;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;

public class File {
	private static final Logger LOG=Logger.getLogger(File.class);
	static String INPUT_PATH="input/t1_num.txt"; 
	static String OUTPUT_PATH="output/t1_num";
	public static final class SampleMapper extends Mapper{
		
		public void map(Object key,Text value,Context context) throws IOException,InterruptedException{
			String gender=value.toString().split(",")[1];
			Random rand=new Random();
			if (gender=="男") {
				if (rand.nextInt(100)<=10) {
					context.write(key, value);
				}
			}else {
				if (rand.nextInt(100)<=20) {
					context.write(key, value);
				}
			}
			
		
	}
		public static void main(String[] arg) throws Exception{
			
			Path outputpath=new Path(OUTPUT_PATH);
			Path inputpath=new Path(INPUT_PATH);
			Configuration conf=new Configuration();
			Job job=Job.getInstance();	
			FileInputFormat.setInputPaths(job, inputpath);
			FileOutputFormat.setOutputPath(job, outputpath);
			job.setJarByClass(File.class);
			job.setMapperClass(SampleMapper.class);
			job.setOutputKeyClass(Object.class);
			job.setOutputValueClass(Text.class);
			job.waitForCompletion(true);
			
			
		}
			
		}
	
	
	
}

 

你可能感兴趣的:(使用MapReduce的分层抽样)