3

私は Piglatin の初心者です。次のようなデータ ファイルがあります (メッセージ、電子メール、usersession、spamType)。

簡単にするために、スパム/非スパムのみを使用しました - このフィールドの値は、通常、約 100 の異なるバリアントです。

message1  user1@email  12345      spam
message2  user1@email  12345      spam
message3  user1@email  12345      not-spam

message10  user2@email  90879      not-spam
message11  user2@email  90879      not-spam

あるユーザーからのメッセージのいずれかがスパムとしてマークされている場合に必要なのは、すべてのメッセージを削除/フィルター処理することです..したがって、上記の出力は次のようになります

message10  user2@email  90879      not-spam
message11  user2@email  90879      not-spam

他の 3 つのメッセージは削除されます - これらは同じユーザー/セッションからのものであるためです。

グループ化とネストを使用して上記の問題を解決しようとしています。

DATA = LOAD './spamdata' using PigStorage() as (message:chararray, mailid:chararray,  session:long, spamType:chararray);
GDATA = GROUP DATA BY (mailid,session);

GDATAは次のようになります

GDATA: {group: (message: chararray,session: long),DATA: {(message: chararray,mailid: chararray,session: long,spamType: chararray)}}

必要なのは、バッグ内の要素に「スパムではない」タイプの要素がないこのグループから要素をダンプすることだけです

4

1 に答える 1

3

次のようなものを思い付くことができます。

DATA = LOAD....;
S =  FOREACH (FILTER DATA BY spamType == 'spam') GENERATE mailid, session;
SPAM = DISTINCT S;
JOINED = JOIN DATA BY (mailid, session) LEFT OUTER, SPAM BY (mailid, session);

RES = FOREACH (FILTER JOINED by SPAM::mailid is null)
  GENERATE $0 AS message, $1 AS mailid, $2 AS session, $3 AS spamType;

dump RES;

ここでの考え方は、スパマーであるユーザーを最初に特定することです。元のデータ セットでこのデータとの左結合を実行した後、適切なテーブルの一致がない行のみを選択することで、スパマー以外のリストを取得できます (例: SPAM::mailid が null)。

于 2013-02-12T15:24:18.293 に答える