私は、ターゲットの単語のグループがあるとします。ブタでは、特定の文字列を含む行数をどのように数えますか?
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
私は豚でそれを行うことができますどのように?ありがとうございました!
私は、ターゲットの単語のグループがあるとします。ブタでは、特定の文字列を含む行数をどのように数えますか?
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
私は豚でそれを行うことができますどのように?ありがとうございました!
まず、各行から重複した単語を削除してから、単語数を実行します。
豚の手順:
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();
}
}
私はトークン化の後に何が起こるのか、実際は分かりません。私は 'A = FOREACHの入力GENERATE FLATTEN(TOKENIZE(行))ASトークンをしようとしていました。 B = FOREACH A GENERATE(トークンはいくつかのキーワード '?1:0)にマッチします;'この 'some keyword'を含む行の数を得ることを期待していましたが、実際にはこの' some keyword'の数を返しました。あなたは私の2行のコードがどのくらい正確に機能するのか説明してください。 – HM9527
私は豚の基礎http://pig.apache.org/docs/r0.16.0/start.html –
をお読みになることをお勧めしますありがとう!それらを徹底的に読んで二日間過ごした。 – HM9527
はI固定ターゲットワードの数です。?ここでも似たような質問に答えました。http://stackoverflow.com/questions/39962608/pig-lati n-word-count –
同じ質問ですが、単語数は混乱するかもしれませんが...目標単語の数がかなり多い場合はどうなりますか? – HM9527
これらの単語を別のリレーションに格納し、リレーション、グループ、カウントで入力を結合するか、ブタスクリプトをパラメータ化し、ループ内のバッチスクリプトから検索ワードを渡してカウントを取得し、結果をマージすることができます。 –