何らかの処理を行うために PIG を使用して非構造化データを構造化しようとしています。
データのサンプルは次のとおりです。
Nov 1 18:23:34 dev_id=03 user_id=000 int_ip=198.0.13.24 ext_ip=68.67.0.14 src_port=99 dest_port=213 response_code=5
期待される出力:
Nov 1 18:23:34, 03 , 000, 198.0.13.24, 68.67.0.14, 99, 213, 5
データが適切に区切られていないことがわかります (タブやコンマなど)。そのため、「\t」を使用してデータをロードしようとし、ターミナルにダンプしました。
A = LOAD '----' using PigStorage('\t') as (mnth: chararray, day: int, --------);
dump A;
Store A into '\root\output';
出力:
ダンプ出力:
(Nov,1,18:23:34,dev_id=03,user_id=000,int_ip=198.0.13.24,ext_ip=68.67.0.14,src_port=99,dest_port=213,response_code=5)
Store oputut: 結果は、ダンプ (カンマ区切り) としてではなく、入力と同じように保存されます。
Nov 1 18:23:34 dev_id=03 user_id=000 int_ip=198.0.13.24 ext_ip=68.67.0.14 src_port=99 dest_port=213 response_code=5
代替案: DataStorage() as (value: varchar) を使用してデータをロードしようとしましたが、TOKENIZE も実行しましたが、目的を達成できませんでした。
私が必要とするいくつかの提案:
月:「11月」、日:「1」、時間:「18:23:34」として3つのフィールドを保存したため。「11 月 1 日 18:23:34」という 3 つのフィールドすべてを時刻として結合することは可能ですか。
すべてのデータは dev_id=03、user_id=000 などの情報とともに保存されますが、情報を削除して 03,000,198.0.13.24 などの情報を保存する必要があります。
PIG を使用してすべての処理を行うことは可能ですか、それとも MapReduce プログラムを作成する必要がありますか。
編集:1
コメントを受け取った後、正常に動作する単一の列に対して REGEX_EXTRACT を試しました。複数の列の場合、次のように REGEX_EXTRACT_ALL を試しました。
A = LOAD '----' using PigStorage('\t') as (mnth: chararray, day: int, dev: chararray, user: chararray --------);
B = foreach A generate REGEX_EXTRACT_All(devid, userid, '(^.*=(.*)$) (^.*=(.*)$)');
Dump B;
エラーが発生しました:
Error: ERROR org.apache.pig.tools.grunt.Grunt - ERROR 1070: Could not resolve REGEX_EXTRACT_All using imports.
REGEX_EXTRACT_All を使用して複数のフィールドを抽出できますか。