2016-10-12 2 views
2

私は、ターゲットの単語のグループがあるとします。ブタでは、特定の文字列を含む行数をどのように数えますか?

a b c d 

と、入力ファイル:

a d f s g e 
12399 
c a d i f 
a 2 

、私は返す必要があります:

a 3 
b 0 
c 1 
d 2 

私は豚でそれを行うことができますどのように?ありがとうございました!

+0

はI固定ターゲットワードの数です。?ここでも似たような質問に答えました。http://stackoverflow.com/questions/39962608/pig-lati n-word-count –

+0

同じ質問ですが、単語数は混乱するかもしれませんが...目標単語の数がかなり多い場合はどうなりますか? – HM9527

+0

これらの単語を別のリレーションに格納し、リレーション、グループ、カウントで入力を結合するか、ブタスクリプトをパラメータ化し、ループ内のバッチスクリプトから検索ワードを渡してカウントを取得し、結果をマージすることができます。 –

答えて

1

まず、各行から重複した単語を削除してから、単語数を実行します。
豚の手順:

REGISTER 'udf-1.0-SNAPSHOT.jar' 
define tuple_set com.ts.pig.UniqueRecords(); 
data = load '<file>' using PigStorage(); 

各ラインから

unique= foreach data generate tuple_set($0) as line; 
words= foreach unique generate flatten(TOKENIZE(line,' ')) as word; 
grouped = group words BY word; 
count= foreach grouped GENERATE group, COUNT(words); 
dump count; 
を重複した単語を削除豚UDFのサンプル・コード:

/** 
* This udf removes duplicate words from line 
*/ 
public class UniqueRecords extends EvalFunc<String> { 
    @Override 
    public String exec(Tuple tuple) throws IOException { 
     if (tuple == null || tuple.size() == 0) 
      return null; 
     String[] splits=tuple.get(0).toString().split(" "); 
     Set<String> elements = new HashSet<String>(Arrays.asList(splits)); 
     StringBuilder sb = new StringBuilder(); 
     for(String element:elements){ 
      sb.append(element+" "); 
     } 
     return sb.toString(); 
    } 
} 
+0

私はトークン化の後に何が起こるのか、実際は分かりません。私は 'A = FOREACHの入力GENERATE FLATTEN(TOKENIZE(行))ASトークンをしようとしていました。 B = FOREACH A GENERATE(トークンはいくつかのキーワード '?1:0)にマッチします;'この 'some keyword'を含む行の数を得ることを期待していましたが、実際にはこの' some keyword'の数を返しました。あなたは私の2行のコードがどのくらい正確に機能するのか説明してください。 – HM9527

+0

私は豚の基礎http://pig.apache.org/docs/r0.16.0/start.html –

+0

をお読みになることをお勧めしますありがとう!それらを徹底的に読んで二日間過ごした。 – HM9527

関連する問題