分享

项目组hadoop实战之归一化:每天更新中。。。

Hedera 发表于 2015-1-30 14:20:20 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 18 37085
Hedera 发表于 2015-1-30 18:19:20
pig2 发表于 2015-1-30 15:51
伪代码如下:
int key=x;
int b=y;

版主,怪我没说清楚哈。我更正了一下,麻烦再看一下哈
回复

使用道具 举报

Hedera 发表于 2015-1-30 18:22:48
s060403072 发表于 2015-1-30 17:11
你的需求需要说的详细些,人家的方法已经说的很明白了,即使不一样,你根据这个改改就可以了。

嗯,怪我表述的不细致。已经重新再次编辑了哈。麻烦再次详阅哈。
回复

使用道具 举报

s060403072 发表于 2015-1-30 19:28:13
Hedera 发表于 2015-1-30 18:22
嗯,怪我表述的不细致。已经重新再次编辑了哈。麻烦再次详阅哈。

比例还是不太明白,这个比例是否固定,你的思路不是已经被否定了吗
回复

使用道具 举报

Hedera 发表于 2015-1-30 19:45:33
本帖最后由 Hedera 于 2015-1-30 19:47 编辑
s060403072 发表于 2015-1-30 19:28
比例还是不太明白,这个比例是否固定,你的思路不是已经被否定了吗

比如有txt的数据如下:
11
54
23
92
104
993
21
42

则归一化的过程如下:
找出最大993,最小11

使用归一化公式(线性函数转换):y=(x-MinValue)/(MaxValue-MinValue)
依次计算每个归一化的结果:
(11-11)/(993-11)=0/982
(54-11)/(993-11)=43/982
(23-11)/(993-11)=12/982
(92-11)/(993-11)=81/982
……
就是这个意思,可以明白不?


回复

使用道具 举报

s060403072 发表于 2015-1-30 20:58:36
Hedera 发表于 2015-1-30 19:45
比如有txt的数据如下:
11
54

你的比例是固定,还是不固定,只需要说明白这点即可,否则无论是公式,还是规律,都的不出来。
回复

使用道具 举报

Hedera 发表于 2015-1-30 22:10:45
s060403072 发表于 2015-1-30 20:58
你的比例是固定,还是不固定,只需要说明白这点即可,否则无论是公式,还是规律,都的不出来。

刚问了一下,不用考虑比例固定,就是直接按归一化公式:(x-min)/(max-min)就可以了。
回复

使用道具 举报

Hedera 发表于 2015-2-4 20:59:54
设计思路二:

刚把这个问题解决了,拿来和大家分享一下。

分两个job来完成。

第一个job来查找最大值最小值,并且保存在hdfs上

第二个job在map阶段使用setup函数从hdfs中读取最大值最小值来初始化。然后使用map与reduce来完成归一化

即用两个线性的mapreduce流来完成。
回复

使用道具 举报

Hedera 发表于 2015-2-4 21:10:23
以下是设计思路二的代码:
  1. package normalizedVersion1;
  2. import java.io.IOException;
  3. import java.util.StringTokenizer;
  4. import org.apache.hadoop.conf.Configuration;
  5. import org.apache.hadoop.fs.Path;
  6. import org.apache.hadoop.io.IntWritable;
  7. import org.apache.hadoop.io.Text;
  8. import org.apache.hadoop.mapreduce.Job;
  9. import org.apache.hadoop.mapreduce.Mapper;
  10. import org.apache.hadoop.mapreduce.Reducer;
  11. import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
  12. import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
  13. import readDataFromHdfs.readDataFromHdfs;
  14. public class normalizedVersion1 {
  15.         
  16.         static float max;
  17.         static float min;
  18.   public static class findMaxMinMapper
  19.        extends Mapper<Object, Text, Text, IntWritable>{
  20.    
  21.     public void map(Object key, Text value, Context context
  22.                     ) throws IOException, InterruptedException {
  23.       StringTokenizer itr = new StringTokenizer(value.toString());
  24.       
  25.       String headStr=itr.nextToken().toString();
  26.       
  27.       float headFloat=Float.parseFloat(headStr);
  28.       
  29.       context.write(new Text("flag"), new IntWritable((int) headFloat));
  30.     }
  31.   }
  32.   public static class findMaxMinReducer
  33.        extends Reducer<Text,IntWritable,Text,IntWritable> {
  34.     private IntWritable result = new IntWritable(1);
  35.     public void reduce(Text key, Iterable<IntWritable> values,
  36.                        Context context
  37.                        ) throws IOException, InterruptedException {
  38.             int minTemp=65533,maxTemp=0;
  39.       for (IntWritable val : values) {
  40.         if(val.get()<(int)minTemp)
  41.                 minTemp=val.get();
  42.         if(val.get()>(int)maxTemp)
  43.                 maxTemp=val.get();
  44.       }
  45.        context.write(new Text(minTemp+"\t"+maxTemp), result);
  46.     }
  47.   }
  48.   public static class normalizedMapper extends Mapper<Object, Text, Text, IntWritable>{
  49.           public void map(Object key, Text value, Context context
  50.                       ) throws IOException, InterruptedException {
  51.             
  52.                 StringTokenizer itr = new StringTokenizer(value.toString());
  53.                
  54.                 String headStr=itr.nextToken().toString();
  55.                
  56.                 float headFloat=Float.parseFloat(headStr);
  57.                
  58.         headFloat=(headFloat-min)/(max-min);
  59.         String headReplice= headFloat+" ";
  60.         String valueStr=value.toString();
  61.         String changeValue=valueStr.replaceFirst(headStr, headReplice);
  62.                 context.write(new Text(changeValue), new IntWritable(1));        
  63.           }
  64.          
  65.           @Override
  66.                 protected void setup(
  67.                                 Mapper<Object, Text, Text, IntWritable>.Context context)
  68.                                 throws IOException, InterruptedException {
  69.                   
  70.                           readDataFromHdfs rdfh=new readDataFromHdfs();
  71.                           String minMaxStr=rdfh.getMinMaxStr();
  72.                           String [] strs=minMaxStr.split("\t");
  73.                     min=Float.parseFloat(strs[0]);
  74.                     max=Float.parseFloat(strs[1]);
  75.                         super.setup(context);
  76.                 }
  77.   }
  78.   
  79.   public static void main(String[] args) throws Exception {
  80.     Configuration conf = new Configuration();
  81.     Job job = Job.getInstance(conf, "findMinMax");
  82.     job.setJarByClass(normalizedVersion1.class);
  83.     job.setMapperClass(findMaxMinMapper.class);
  84.     job.setReducerClass(findMaxMinReducer.class);
  85.     job.setOutputKeyClass(Text.class);
  86.     job.setOutputValueClass(IntWritable.class);
  87.     FileInputFormat.addInputPath(job, new Path(args[0]));
  88.     FileOutputFormat.setOutputPath(job, new Path(args[1]));
  89.     if(!job.waitForCompletion(true))
  90.             System.exit(1);
  91.    
  92.     Job job1 = Job.getInstance(conf, "normalize");
  93.     job1.setJarByClass(normalizedVersion1.class);
  94.     job1.setMapperClass(normalizedMapper.class);
  95.     job1.setOutputKeyClass(Text.class);
  96.     job1.setOutputValueClass(IntWritable.class);
  97.     FileInputFormat.addInputPath(job1, new Path(args[0]));
  98.     FileOutputFormat.setOutputPath(job1, new Path(args[2]));
  99.     System.exit(job1.waitForCompletion(true) ? 0 : 1);
  100.    
  101.   }
  102. }
复制代码
回复

使用道具 举报

Hedera 发表于 2015-2-5 17:12:04
回复

使用道具 举报

12
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条