2017-11-01 11 views
2

Iamがhadoop(mapreduce)を学習しようとしています。私はマッパーメソッドを持っています。このメソッドでは、Dateクラスを使って; epoch_time;フィールドは、データセットからのミリ秒単位で表されます。データセットは、25.05.2015から10.08.2015の間の期日で構成されます。エポックを日付と時刻に変換する - HADOOP

エポックを日付/時刻に変換したいのですが、05.06.2015から15.06.2015までのエポックからの日付/時刻のみを返します。

ここまでは私がこれまで達成してきたことです。以下のコードは、次のように生成:

出力:

2015年5月25日

2015年6月25日

など

所望の出力

2015年6月5日5 //カウントをこの日の単語の出現

06.06。 2015年53

2015年7月6日41

など

マッパー

public class mapper extends Mapper<Object, Text, Text, IntWritable> { 
    private Text data = new Text(); 
    private IntWritable one = new IntWritable(1); 
    String time; 

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

String[] userinput = value.toString().split(";"); 
try{  


     LocalDateTime epoch = LocalDateTime.ofEpochSecond(Long.parseLong(userinput[0])/1000, 0, ZoneOffset.UTC); 
     DateTimeFormatter f = DateTimeFormatter.ofPattern("dd.MM.yyyy"); 
     time = epoch.format(f); 




    data.set(time); 
    context.write(data,one); 
} 
catch(Exception e){ 
    System.out.println("Error: " + e); 
} 

    } 
} 

リデューサー

 public class reducer extends Reducer<Text, IntWritable, Text, IntWritable> { 

private IntWritable one = new IntWritable(); 

public void reduce(Text key, Iterable<IntWritable> values, Context context) 

    throws IOException, InterruptedException { 

    int sum = 0; 

    for (IntWritable value : values) { 

     sum+=value.get(); 

    } 

    one.set(sum); 
    context.write(key, one); 

} 

}

+0

こんにちは、コードは私のマッパークラスからわずかスニペットで確認してください。私はマッパー、減速機、ドライバークラスを持っています。あなたは、使用する日付のパターンをアドバイスしてもらえますか?多くのありがとう – user2023

+0

そして、Hadoopについてではないことについての私の主張は、まだ正確です。日付範囲を特定するための単体テストまたは通常のJavaプログラムを作成して、マッパに条件を入れて、気になる日付範囲のサブセットを抽出することができます –

+0

こんにちは、日付形式の期間があります。コードは更新されたコードスニペットをご覧ください。期間にアクセスするにはどうすればよいですか?日付範囲を取得する方法の例を教えてください。 – user2023

答えて

0

ですから、これだけbrackettedデータを気に.. 。25.05.2015 [05.06.2015 ... 15.06.2015] 10.08.2015

これがすべて必要な場合は、ifのように簡単です。

私は、Java 8とその慣れていないんだけど、このJava: how do I check if a Date is within a certain range?

public class mapper extends Mapper<Object, Text, Text, IntWritable> { 
    private Text data = new Text(); 
    private static final IntWritable ONE = new IntWritable(1); 
    private static final DateTimeFormatter FMT = DateTimeFormatter.ofPattern("dd.MM.yyyy"); 
    String time; 

    // Define the boundaries 
    private LocalDateTime start = LocalDateTime.parse("2015.06.05", FMT); 
    private LocalDateTime end = LocalDateTime.parse("2015.06.15", FMT); 

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

     String[] userinput = value.toString().split(";"); 
     try { 
      Long ms = Long.parseLong(userinput[0])/1000;  
      LocalDateTime inputEpoch = LocalDateTime.ofEpochSecond(ms, 0, ZoneOffset.UTC); 

      // Filter your data 
      if (inputEpoch.isAfter(start) && inputEpoch.isBefore(end)) { 
       data.set(inputEpoch.format(FMT)); 
       context.write(data,ONE); 
      } 
     } catch (...) { } 
    } 
} 
+0

私はクラスを修正しました。あなたの提案を適用しましたが、私は2つのエラーを取得します。方法ChronoLocalDateTime.isAfter(ChronoLocalDateTime )があれば(inputEpoch.isAfter(開始)&& inputEpoch.isBefore(終了)){ [javacの]^ [javacの]方法ChronoLocalDateTime.isBefore(ChronoLocalDateTime )が適用されない、適用されません。 (引数の不一致; LocalDateをChronoLocalDateTime に変換できません) – user2023

+0

「LocalDateTime」が必要です。再試行する。 –

+0

多くの感謝cricket_007。これはうまくいった。 – user2023

関連する問題