2016-08-16 78 views
4

銷售激勵類減速,MapReduce的,不顯示錯誤,但沒有給出所需的輸出

package mr.map; 

import org.apache.hadoop.conf.Configuration; 
import org.apache.hadoop.fs.Path; 
import org.apache.hadoop.mapreduce.Job; 
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat; 
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; 

import org.apache.hadoop.io.Text; 
import org.apache.hadoop.io.FloatWritable; 
//import org.apache.hadoop.mapreduce.Mapper; 
//import org.apache.hadoop.mapreduce.Reducer; 

public class SalesDriver 
{ 
    public static void main(String args[]) throws Exception 
    { 
     Configuration c=new Configuration(); 
     Job j=new Job(c,"Sales"); 

     j.setJarByClass(SalesDriver.class); 
     j.setMapperClass(SalesMapper.class); 
     j.setReducerClass(SalesReducer.class); 

     //j.setNumReduceTasks(0); 
     j.setOutputKeyClass(Text.class); 
     j.setOutputValueClass(FloatWritable.class); 

     Path in=new Path(args[0]); 
     Path out=new Path(args[1]); 

     FileInputFormat.addInputPath(j, in); 
     FileOutputFormat.setOutputPath(j, out); 

     System.exit(j.waitForCompletion(true)?0:1); 
    } 
} 

銷售映射類

package mr.map; 

import java.io.IOException; 

//import org.apache.hadoop.io.IntWritable; 
import org.apache.hadoop.io.FloatWritable; 
import org.apache.hadoop.io.LongWritable; 
//import org.apache.hadoop.io.DoubleWritable; 
import org.apache.hadoop.io.Text; 
import org.apache.hadoop.mapreduce.Mapper; 

public class SalesMapper extends Mapper<LongWritable, Text, Text, FloatWritable> 
{ 
    public void map(LongWritable k, Text v, Context con) throws IOException, InterruptedException 
    { 
     String w[]=v.toString().split(" "); 
     String product=w[3]; 
     //String store=w[2]; 
     //float cost=Integer.parseInt(w[4]); 
     float costx = Float.parseFloat(w[4]); 

     //String newline= product+","+store; //","+costx; 
     //String newline = product; 
     con.write(new Text(product), new FloatWritable(costx)); 
    } 
} 

銷售減速類

package mr.map; 

import java.io.IOException; 

import org.apache.hadoop.io.FloatWritable; 
//import org.apache.hadoop.io.IntWritable; 
//import org.apache.hadoop.io.DoubleWritable; 
import org.apache.hadoop.io.Text; 
import org.apache.hadoop.mapreduce.Reducer; 

public class SalesReducer extends Reducer<Text, FloatWritable, Text, FloatWritable> 
{ 
    public void reduce(Text k, Iterable<FloatWritable>vlist, Context con) throws IOException, InterruptedException 
    { 
     int tot=0; 
     for (FloatWritable v:vlist) 
     { 
      tot += v.get(); 
     } 
     //int total= (int)tot; 
     con.write(new Text(k), new FloatWritable(tot)); 
    } 
} 

結果MapReduce

Result of the MapReduce

我不明白爲什麼所有的結果都出現在一個大的浮點數和全部數字5.7480884E7。

下面是輸入到映射精簡程序的例子:

2012-01-01 09:00 San Jose Men's Clothing 214.05 Amex    
    2012-01-01 09:00 Fort Worth Women's Clothing 153.57 Visa   
    2012-01-01 09:00 San Diego Music 66.08 Cash      
    2012-01-01 09:00 Pittsburgh Pet Supplies 493.51 Discover   
    2012-01-01 09:00 Omaha Children's Clothing 235.63 MasterCard  
    2012-01-01 09:00 Stockton Men's Clothing 247.18 MasterCard   
    2012-01-01 09:00 Austin Cameras 379.6 Visa       
    2012-01-01 09:00 New York Consumer Electronics 296.8 Cash   
    2012-01-01 09:00 Corpus Christi Toys 25.38 Discover    
    2012-01-01 09:00 Fort Worth Toys 213.88 Visa      
    2012-01-01 09:00 Las Vegas Video Games 53.26 Visa     
    2012-01-01 09:00 Newark Video Games 39.75 Cash      
    2012-01-01 09:00 Austin Cameras 469.63 MasterCard     
    2012-01-01 09:00 Greensboro DVDs 290.82 MasterCard     
    2012-01-01 09:00 San Francisco Music 260.65 Discover    
    2012-01-01 09:00 Lincoln Garden 136.9 Visa       
    2012-01-01 09:00 Buffalo Women's Clothing 483.82 Visa    
    2012-01-01 09:00 San Jose Women's Clothing 215.82 Cash    
    2012-01-01 09:00 Boston Cameras 418.94 Amex      
    2012-01-01 09:00 Houston Baby 309.16 Visa       
    2012-01-01 09:00 Las Vegas Books 93.39 Visa      
    2012-01-01 09:00 Virginia Beach Children's Clothing 376.11 Amex 
    2012-01-01 09:01 Riverside Consumer Electronics 252.88 Cash  
    2012-01-01 09:01 Tulsa Baby 205.06 Visa       
    2012-01-01 09:01 Reno Crafts 88.25 Visa       
    2012-01-01 09:01 Chicago Books 31.08 Cash       
    2012-01-01 09:01 Fort Wayne Men's Clothing 370.55 Amex    
    2012-01-01 09:01 San Bernardino Consumer Electronics 170.2 Cash 
    2012-01-01 09:01 Madison Men's Clothing 16.78 Visa     
    2012-01-01 09:01 Austin Sporting Goods 327.75 Discover    
    2012-01-01 09:01 Portland CDs 108.69 Amex       
    2012-01-01 09:01 Riverside Sporting Goods 15.41 Discover   
    2012-01-01 09:01 Reno Toys 80.46 Visa        
    2012-01-01 09:01 Anchorage Music 298.86 MasterCard  
+0

這個輸出映射縮減programBaby \t 5.7480884E7 書籍\t 5.743978E7 光盤\t 5.7400252E7 相機\t 5.728862E7 兒童服裝\t 5.7612936E7 計算機\t 5.7303832E7 消費電子\t 5.744192E7 工藝品\t 5.7407532E7 DVDs \t 5.763812E7 Garden \t 5.7528848E7 健康與美容\t 5.7469112E7 男士服裝\t 5.7609916E7 音樂\t 5.7484752E7 寵物用品\t 5.7186328E7 體育用品\t 5.7587608E7 玩具\t 5.7452464E7 視頻遊戲\t 5.750184E7 女裝\t 5。7423576E7 – habeebsiddique

回答

0

變化減速器的輸出值類型設置爲文本,並轉換浮動到預期的格式字符串。

String.format("%f",tot) 

按照以下職位詳細信息格式化數字:
with scientific
without scientific notation

減速機:

public class SalesReducer extends Reducer<Text, FloatWritable, Text, Text> 
{ 
    public void reduce(Text k, Iterable<FloatWritable>vlist, Context con) throws IOException, InterruptedException 
    { 
     float tot=0; 
     for (FloatWritable v:vlist) 
     { 
      tot += v.get(); 
     } 
     //int total= (int)tot; 
     con.write(new Text(k), new Text(String.format("%f",tot))); 
    } 
} 
+0

我遵循上面給出的轉換爲字符串。但我得到的錯誤是「java.util.IllegalFormatConversionException:f!= java.lang.Integer」。我用「%s」替換了「%f」。該程序運行沒有錯誤,但輸出是57400252,而不是5.7400252E7,即沒有小數位 – habeebsiddique

+0

我發佈它給你提供線索有關的問題。你可以做的是改變tot的數據類型爲float。使用DecimalFormat api來實現所需的格式。 –

+0

我也改變了tot類型來浮動,但它給出了相同的結果。 – habeebsiddique

0

您存儲int變量花車和的值。
現在第一件事是int不能在小數點後精確處理浮點值。其次,如果行數非常高,則總和值可能會超出可接受的範圍 int

請嘗試將int變量從int更改爲 float double

double tot=0; 
+0

我改變了類型浮動。它給出了和以前一樣的結果。 – habeebsiddique

+0

您的輸入數據集包含您試圖在空間上分離的可變長度記錄。 ** 2012-01-01 09:00聖何塞男士服裝214.05美國運通** 這有在W [6]位置的數值,而 ** 2012-01-01 09:01雷諾玩具80.46 Visa ** 這已經在w [4]了。如果製圖人員正在計算字符串的正確位置,我不確定。 –

+0

這些字段由製表符間隔分開,我在映射器中使用製表符間隔符。該映射器正在給出正確的輸出。 – habeebsiddique