0

pigスクリプト用のフィルター関数を作成しましたが、作業に時間がかかりすぎています。処理されるデータの量は、5ノードクラスターで15GBです。

誰かが私のコードを最適化する方法を提案できますか?

     package org.apache.pig.builtin;
    import java.util.*;
    import java.io.IOException;
    import java.util.Map;
    import org.apache.pig.FilterFunc;
    import org.apache.pig.backend.executionengine.ExecException;
    import org.apache.pig.data.DataBag;
    import org.apache.pig.data.Tuple;
    import org.apache.pig.data.DataType;
    import org.apache.pig.impl.util.WrappedIOException;

   public class filterIP extends FilterFunc {
     ArrayList<String> Ar1=new ArrayList<String>(){
    {
add("151.193.220.28");
....
//Around 2000 IP's to be filtered
add("129.22.63.207");
    }
    };
       public Boolean exec(Tuple input) throws IOException {
           if (input == null || input.size() == 0)
               return true;
           try {
               Object values = input.get(0);
               if (values instanceof DataBag)
                   return ((DataBag)values).size() == 0;
               else if (values instanceof Map)
                   return ((Map)values).size() == 0;
           else if (values instanceof String){

            for(String s:Ar1){
            if(((String)values).matches(".*"+s+".*"))
            return false;
            }
            return true;
            //return !((String)values).matches(".*"+Ar1.get(1)+".*");
            }
               else{
            return false;
                  // throw new IOException("Cannot test a " + DataType.findTypeName(values) + " for required match.");
               }
           } catch (ExecException ee) {
               throw WrappedIOException.wrap("Caught exception processing input row ", ee);
           }
       }
   }*
4

1 に答える 1

1

ArrayListではなくHashSetを使用してfor (String s:Ar1)ください-これがボトルネックです。

IPアドレスのセットでフィールドをフィルタリングしようとしていますか?、matches()呼び出しをset.contains(values)に置き換えることはできますか?ただし、これは、値にIPアドレスのみが含まれ、修正前/修正後の文字が含まれていない場合にのみ機能します。ただし、正規表現を記述して最初にIPアドレス文字列を検索し、それを抽出してから、ハッシュに対してメンバーシップを確認できると確信しています。セットする。

于 2012-05-18T10:41:31.077 に答える