1

複数の列で正規表現マッチングを実行しようとしています。

サンプルデータは次のとおりです。

(dev=03,user=000,intip=138.40.13.24,extip=198.167.0.194,src_port=1109,dest_port=2613,response=6) (dev=03,user=000,intip=148.12.16.78,extip= 168.67.0.10、src_port=1460、dest_port=3610、応答=6)

期待される出力:

(03,000,138.40.13.24,198.167.0.194,1109,2613,6)

(03,000,148.12.16.78,168.67.0.10,1460,3610,6)

スクリプトは次のとおりです。

A = LOAD '---' using PigStorage as (value: chararray);

B = foreach A generate REGEX_EXTRACT_ALL('value', '(^.=(.)$)');

dump B;

出力: ブランク

()

()

()

スクリプトを使用して単一の列で正規表現一致を実行する場合:

A = LOAD '---' using PigStorage as (dev: chararray, user:chararray, intip:chararray, extip:chararray, srcport:chararray, destport:chararray, response:chararray);

B = foreach A generate REGEX_EXTRACT(dev, '(^.=(.)$)');

dump B;

出力:

(03) (03)

誰でも私に知らせてもらえますか、私の間違いはありますREGEX_EXTRACT_ALLか?

返信をお待ちしております。ご協力をお願いいたします。

4

2 に答える 2

1

古いスレッドですが、同じ問題を抱えていることに遭遇したので、他の人を助けるかもしれません

最初のスクリプトから始めて、サンプル データが pig タプルではなく生の入力であると仮定します。

  1. PigStorage は、1 文字の区切り記号に基づいてフィールドに分割されます。処理するコンマと括弧があるため、代わりに TextLoader を使用してください

  2. あなたのパターンは一致しません。すべての行を説明するもので、キャッチしたいものを「グループ化」するかっこである必要があります

  3. FLATTEN を使用すると、REGEX_EXTRACT_ALL からタプルを作成できます

そう :

A = LOAD 'stack' using TextLoader as (line:chararray);

B = FOREACH A GENERATE FLATTEN(REGEX_EXTRACT_ALL(line, '^\\(dev=(\\d{2}),user=(\\d{3}),intip=(\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}),extip=(\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}),src_port=(\\d{1,5}),dest_port=(\\d{1,5}),response=(\\d{1})\\)$'));

dump B

出力は

(03,000,138.40.13.24,198.167.0.194,1109,2613,6)

(03,000,148.12.16.78,168.67.0.10,1460,3610,6)

于 2015-02-01T11:36:21.923 に答える