クリーニングのデータ(第一の実験)

パッケージtiqu。

インポートにjava.io.IOException;
輸入java.text.ParseException。
輸入java.text.SimpleDateFormatの。
輸入java.util.Date;
インポートたjava.util.Locale; 






輸入org.apache.hadoop.conf.Configuration。
輸入org.apache.hadoop.fs.Path。
輸入org.apache.hadoop.io.LongWritable;
輸入org.apache.hadoop.io.NullWritable;
輸入org.apache.hadoop.io.Text;
輸入org.apache.hadoop.mapreduce.Job。
輸入org.apache.hadoop.mapreduce.Mapper;
輸入org.apache.hadoop.mapreduce.Reducer;
輸入org.apache.hadoop.mapreduce.lib.input.FileInputFormat。
輸入org.apache.hadoop.mapreduce.lib.input.TextInputFormat。
輸入org.apache.hadoop.mapreduce.lib.output.FileOutputFormat。
輸入org.apache.hadoop.mapreduce.lib.output.TextOutputFormat。

パブリック クラスTiQu { 
    
    パブリック 静的の クラスマップが拡張マッパー<オブジェクト、テキスト、テキスト、NullWritable> {
         プライベート 静的のテキストをNEWKEY = 新しいテキスト(); 

        / * 公共ボイドマップ(オブジェクトキー、テキスト値、コンテキストコンテキスト)にIOException、例外:InterruptedExceptionをスロー{ 
            文字列の行= value.toString()。
            System.out.println(ライン)。
            文字列ARR [] = line.split(」「)。
            newKey.set(ARR [1])。
            context.write(NEWKEY、NullWritable.get())。
            System.out.println(NEWKEY)。
        } 
    } * / 
    公共 ボイドマップ(オブジェクトキー、テキスト値、コンテキストコンテキスト)スローにIOException、InterruptedExceptionある{ 
        ストリングS1 = value.toStringは(); 
         Log Parserツールのパーサー = 新しいLog Parserツール();
            最終的な文字列[]配列= parser.parse(S1)。
        System.out.println(S1)。
        / *System.out.format(
                "解析结果:IP =%sは、時間=%S、日=%S、トラフィック=%S、タイプ=%S、ID =%s"は、
                配列[0]、配列[1]、配列[2]配列[3]、配列[4]、配列[5])。
        context.write(NEWKEY、NullWritable.get())。* / 
        ストリング =配列[0 ]。
        文字列Uが配列= [1 ]。
        列c =配列[2 ]。
        列D =配列[3 ]。
        文字列E =配列[4 ]。
        文字列F =配列[5 ]。
        
        文字列str = A + " "+ U +" "+ C +" "+ D +" "+ E +"" + F。
        
        newKey.set(STR)。
        System.out.println(NEWKEY)。

      低減は延び減速<テキスト、NullWritable、テキスト、NullWritable> {
         公共 ボイド低減(テキストキー、反復処理可能<NullWritable> 値は、コンテキスト・コンテキスト)が
                 スローにIOException、InterruptedExceptionある{ 
            context.write(キー、NullWritable.getを())。
        } 
    } 

    パブリック 静的 ボイドメイン(文字列[]引数)をスローにIOException、ClassNotFoundExceptionが、InterruptedExceptionある{ 
        構成CONF = 新規構成();
        System.out.println( "スタート" ); 
        
    
        ジョブジョブ = 新しい仕事(confに、「フィルタ」)。
        job.setJarByClass(TiQu。クラス); 
        job.setMapperClass(地図。クラス); 
        job.setReducerClass(リデュース。クラス)。
        job.setOutputKeyClass(テキスト。クラス); 
        job.setOutputValueClass(NullWritable。クラス); 
        job.setInputFormatClass(TextInputFormat。クラス); 
        job.setOutputFormatClass(TextOutputFormat。クラス); 
        PATHに = 新しいですパス( "HDFS:// localhostを:9000 / mymapreduce1 /中/結果" ); 
        パスアウト = 新しいですパス( "HDFS:// localhostを:9000 / mymapreduce1 / tiqu" ); 
        FileInputFormat.addInputPath(ジョブ、中)。
        FileOutputFormat.setOutputPath(ジョブ、アウト)。
        System.exit(job.waitForCompletion()0:1 )。
    } 
    静的 クラス MyMapperは延び
    マッパー <LongWritable、テキスト、LongWritable、テキスト> { 
Log ParserツールLOGPARSER = 新しいLog Parserツール()。
テキストoutputValue = 新しいテキスト(); 

保護された 無効マップ(
        LongWritableキー、
        テキスト値、
        org.apache.hadoop.mapreduce.Mapper<LongWritableは、テキスト、LongWritable、テキスト> .contextコンテキスト)が
         スローにjava.io.IOException、InterruptedExceptionが{
     最終列[]構文解析=のlogParser.parse(value.toString()); 

    // 静的リソースアクセス要求アウトステップ1フィルタ
    場合(の解析された[2] .startsWith( "GET /静的/"  ||解析された[2] .startsWith( "GET / uc_server"の)){
         リターン; 
    } 
    // 。ステップ2は、指定された文字列の先頭で濾別
    IF(構文解析[の2] .startsWith( "GET /" )){ 
        の構文解析[ 2] =構文解析の[2] .substring( "GET /" .LENGTH()); 
    }(解析された[2] .startsWith( "役職 /" IF )){ 
        解析されるのは、[ 2] =構文解析の[2]( "POST /" .substring .LENGTH()); 
    } 
    // 。特定の文字列の末尾アウトステップ3フィルタを
    IFに(解析された[2] .endsWith(「HTTP /1.1 " )){ 
        構文解析[の 2] =構文解析の[2](0 .substring、解析された[2 ] .LENGTH()
                 - " HTTP / 1.1 " .LENGTHは()); 
    } 
    // ステップ4は、3つだけが書き込まれます。アイテムの種類の記録 
    ([1]構文解析の解析済+ [0] + "\ T"構文解析+ [2 + "\ T" outputValue.setを]); 
    context.write(キー、OutputValue); 
} 
} 

静的 クラス MyReducerは延びて
    減速を <LongWritable、テキスト、テキスト、NullWritable>{
 保護 ボイド(減らします
        LongWritable K2、
        java.lang.Iterable <テキスト> V2が構成、
        org.apache.hadoop.mapreduce.Reducer <LongWritable、テキスト、テキスト、NullWritable> .Contextコンテキスト)が
         スローにjava.io.IOException、InterruptedExceptionあるが{
     ため(テキストV2:V2が構成){ 
        context.write(V2、NullWritable.get())。
    } 
}。
} 

/ * 
*日志解析类
* / 
静的 クラス  Log Parserツール{
 パブリック 静的 最終のSimpleDateFormat FORMAT = 新しいてSimpleDateFormat(
         "D / MMM / YYYY HH:MM:SS"、Locale.ENGLISH)。
パブリック 静的 最終てSimpleDateFormat dateformat1 = 新しいてSimpleDateFormat(
         "YYYY-MM-DD HH:MM:SS" )。



/ ** 
 *解析英文时间字符串
 * 
 * @paramの文字列
 * @return 
 * @throws はParseException
  * / 
プライベート日付parseDateFormat(文字列){ 
    日パース = nullを試す{ 
        パース = FORMAT.parse(列)。
    } キャッチ(はParseException電子){ 
        e.printStackTrace(); 
    } 
    戻り解析。
} 

/ ** 
 *ログイン解消行
 * 
 * @param ライン
 * @return 配列は、5つの要素、すなわち、IP、時間、日付、状態、流量含ま
  * / 
公共String []型の解析(文字列ラインを) { 
    文字列IP = parseIP(行); 
    文字時間 = parseTime(行)
    列日 = parseday(行); 
    文字列のトラフィック = parseTraffic(行); 
    文字列型 = parsertype(行); 
    文字列ID = parseid(行); 


    リターン 新しいです文字列[] {IP、時間、日、トラフィック、タイプ、ID}。
} 
プライベート文字parseIP(列線){ 
    文字列IP = line.split( "")[0 ] .trim()。
    リターンIP; 
} 

プライベート文字parseTime(列線){
     最終 INT最初= line.indexOf( "" )。
    最終 int型最後= line.indexOf( "0800" ); 
    ストリング時間 = line.substring(第+ 1 、最後).trim(); 
    日付日付 = parseDateFormat(時間);
    リターンdateformat1.format(日); 
} 

プライベート文字列parseday(列線){ 
    文字riqi = line.split( "")[2 ] .trim()。
    リターンriqi。
}
プライベート文字parseTraffic(列線){ 
    文字列riqi = line.split( "")[3 ] .trim()。
    リターンriqi。
} 
// プライベート文字列parseTraffic(列線){
    // 最終的な文字列のトリム= line.substring(line.lastIndexOf( "")+ 1)
       //       .trim()。
    // 文字列のトラフィック= trim.split(」「)[0];
    // 戻りトラフィック;
// } 

// プライベート文字列parsertype(列線){
  //    最終INT最初= line.indexOf( "")。
   // 最終int型最後= line.lastIndexOf( "");
  //   文字列のURL =最初+ 1(line.substring、
  //   戻りURL;
// } 
プライベート文字列parsertype(列線){ 
    文字列riqi = line.split( "")[4 ] .trim()。
    リターンriqi。
} 

プライベート文字列parseid(列線){
     最終的な文字列のトリム=(line.lastIndexOf( "")+ 1 line.substring 
            .trim(); 
    文字列ID = trim.split(」「)[0 ];
    戻り値のID。
} 






} 

    
    
}

これは、所定のフォーマットへのデータであり、フォーマット変換時間2019年11月13日

内蔵のテーブル:

 

 HDFSはリストにドキュメントを追加します。

 

おすすめ

転載: www.cnblogs.com/birdmmxx/p/11853893.html