3

Pigを使用してログ ファイルを分析しています。

入力ログ ファイル ('/user/586376/Pig_C') は次のようになります。

12901890 \t rosieブログ\t 2006-05-15 21:42:19 \t 1 \t http://www.rosie.com

A = load '/user/586376/Pig_C' as (ID:int, query:chararray, time:chararray, rank:int, url:chararray);

ここでは、午前 10 時から午前 11 時までの時間帯によくアクセスするサイト (トップ 3 )をリストします。

現在、時間フィールドで STRSPLIT を使用して、必要な時間を抽出しています。

Timesplit = FOREACH A GENERATE url, STRSPLIT(time,' ') as time_split;

B = FOREACH Timesplit GENERATE url, FLATTEN(time_split) as (date,time1); 

C = FOREACH B GENERATE url, STRSPLIT(time1,':') as h;

final = FOREACH C GENERATE url,flatten(h) AS (hour,min,sec); 

時間フィールドを分割した後、FILTERGROUP BY、およびCOUNT UDFを使用して、午前 10 時と午前 11 時に頻繁にアクセスされる上位 3 つの URL を見つけます。

出力:

(http://www.google.com,5)

(http://finance.yahoo.com,2)

(http://www.nada.com,2)

しかし、STRSPLIT を使用するのではなく、 PIG UDF をregex_extractおよびregex_extract_allとして使用して、時間フィールドを取得する簡単な方法があるに違いないと思います。しかし、与えられたタイムスタンプから必要な時間を抽出するための正規表現を書くことができません。

指定されたタイムスタンプから時間を見つけるための正規表現を作成するためのアイデアはありますか?

編集:

時間を抽出するために豚で次の正規表現を書きました:

data = FOREACH A GENERATE url, FLATTEN(EXTRACT(time,'\\d{4}-\\d{2}-\\d{2}\\s(\\d{2}):\\d{2}:\\d{2}')) AS (hour:chararray) ;

しかし、次のエラーが発生し、

エラー:

2013-08-19 18:20:28,745 [main] ERROR org.apache.pig.tools.grunt.Grunt - ERROR 1045: org.apache.pig.piggybank.evaluation.string.RegexExtract のマッチング関数を推測できませんでした複数またはどれも適合しません。明示的なキャストを使用してください。

どこが間違っているのでしょうか?

4

2 に答える 2

1

あなたのデータは適切にフォーマットされているように見えるので、次の式を使用してタイムスタンプを照合できると思います。グループ内の時間のみがキャプチャされることに注意してください。タイムスタンプの他の部分が必要な場合は、括弧で囲みます( and )

\d{4}-\d{2}-\d{2}\s(\d{2}):\d{2}:\d{2} 
于 2013-08-19T11:09:04.067 に答える