2016-07-18 14 views
0

私は以下のようなCSVファイルを持っています。特定の日に最大値で販売された製品を計算するmapReduceプログラムを書いています。マッパーの出力は形式でなければならないことについてMapperをコンマで区切った値として出力

CSV Data

1/2/09 => [製品1、Product2、製品1、Product2、Product4、.....]

私は

public void map(LongWritable key, Text value, OutputCollector<Text, Text> output, Reporter reporter) 
     throws IOException { 

    String line = value.toString(); 
    String[] arrLine = line.split(","); 

    String strDateTime  = arrLine[0];  
    String strDate = strDateTime.substring(0, strDateTime.indexOf(" ")); 
    String strProductName = arrLine[1]; 

    Map products = new HashMap<String, String>(); 
    String strProdAdded = null; 

    if(products.get(strDate)!= null) 
    { 
     strProdAdded = products.get(strDate).toString(); 
     strProdAdded += strProductName + ","; 
     products.put(strDate, strProdAdded); 
    }else 
    { 
     products.put(strDate, strProductName); 
    } 

    output.collect(new Text(strDate), new Text(strProductName)); 
} 

以下のようにマッパーコードを書かれている。しかし、私は

以下のように所望の出力を得るための正確な方法を考え出すことができません

1/2/09 => [製品1、Product2、製品1、Product2、Product4、.....]

答えて

0

は、あなたがこの方法で何が起こっているのかを理解することができますので、私はSystem.outステートメントを追加した、cleanup()メソッドを使用する必要があります。入力あなたがMapper class here.

public static class StackMapper extends Mapper<Object, Text, Text, Text> { 

     private Map<Text, ArrayList<Text>> products = new HashMap<Text, ArrayList<Text>>(); 
     private ArrayList<Text> p = new ArrayList<Text>(); 

     @Override 
     public void map(Object key, Text value, Context context) throws IOException, InterruptedException { 

       String line = value.toString(); 
       String[] arrLine = line.split(","); 

       Text strDate = new Text(arrLine[0].substring(0, arrLine[0].indexOf(" "))); 
       Text strProductName = new Text(arrLine[1]); 

       if(products.containsKey(strDate)) 
       { 
        if(!products.get(strDate).contains(strProductName)) { 
         System.out.println("has date: " + strDate + " " + strProductName + " not exist, added to list: " + p.toString()); 
         p.add(strProductName); 
        } 
        System.out.println("has date: " + strDate + ", " + strProductName + " added to list: " + p.toString());  
       }else 
       { 
        p = new ArrayList<Text>(); 
        p.add(strProductName); 

        System.out.println("new date: " + strDate + ", " + strProductName + " added to list: " + p.toString()); 
       } 

       products.put(new Text(strDate), p); 
     } 

     @Override 
     protected void cleanup(Context context) 
       throws IOException, InterruptedException { 
      for (Text date : products.keySet()){ 
       context.write(date, new Text(products.get(date).toString())); 
      } 

     } 
    } 

に使用できる利用可能な方法を参照してください。

1/2/09 6:17,product1,f3,f4,f5 
1/2/09 6:17,product2,f3,f4,f5 
1/2/09 6:17,product3,f3,f4,f5 
1/2/09 6:17,product4,f3,f4,f5 
1/2/09 6:17,product4,f3,f4,f5 
1/2/10 6:17,product1,f3,f4,f5u 
1/2/10 6:17,product2,f3,f4,f5u 
1/2/10 6:17,product3,f3,f4,f5u 
1/2/11 6:17,product2,f3,f4,f5u 
1/2/12 6:17,product2,f3,f4,f5u 
1/2/12 6:17,product3,f3,f4,f5u 

出力:

1/2/09 [product1, product2, product3, product4] 
1/2/10 [product1, product2, product3] 
1/2/12 [product2, product3] 
1/2/11 [product2] 

MRジョブのSTD出力:エフォート@BigDataLearnerため

new date: 1/2/09, product1 added to list: [product1] 
has date: 1/2/09 product2 not exist, added to list: [product1] 
has date: 1/2/09, product2 added to list: [product1, product2] 
has date: 1/2/09 product3 not exist, added to list: [product1, product2] 
has date: 1/2/09, product3 added to list: [product1, product2, product3] 
has date: 1/2/09 product4 not exist, added to list: [product1, product2, product3] 
has date: 1/2/09, product4 added to list: [product1, product2, product3, product4] 
has date: 1/2/09, product4 added to list: [product1, product2, product3, product4] 
new date: 1/2/10, product1 added to list: [product1] 
has date: 1/2/10 product2 not exist, added to list: [product1] 
has date: 1/2/10, product2 added to list: [product1, product2] 
has date: 1/2/10 product3 not exist, added to list: [product1, product2] 
has date: 1/2/10, product3 added to list: [product1, product2, product3] 
new date: 1/2/11, product2 added to list: [product2] 
new date: 1/2/12, product2 added to list: [product2] 
has date: 1/2/12 product3 not exist, added to list: [product2] 
has date: 1/2/12, product3 added to list: [product2, product3] 
+0

感謝。あなたのソリューションは私の要件に近づきました – Mugil

0

あなたは私の意見では、期待されている出力、Reduceジョブの結果である可能性があり。これは本質的にGroupByの日付クエリの実装であり、わかっている限り、それはreduce jobによって処理されます。 あなたのプログラムによれば、マップ・ジョブから正しいキーと値を出力していると思います。ソート、シャッフル、レデューサーへ渡されると、グループ化された特定の日付のすべての製品を見ることができます。

P.S.あなたがMap-Reduceであなたの手を試す練習としてこれをやっていない限り、私は豚やハイブを使ってこの問題に対処しています。