2

Apache Pig Latin を使用してログ処理を行おうとしていますが、これを行う簡単な方法があるかどうか疑問に思っていました。

filtered_logs = FOREACH logs GENERATE numDay, reqSize, optimizedSize, origSize, compressionPct, cacheStatus;

grouped_logs = GROUP filtered_logs BY numDay;

results = FOREACH grouped_logs GENERATE group,
(SUM(filtered_logs.reqSize) + SUM(filtered_logs.optimizedSize)) / 1048576.00 AS     ClientThroughputMB,
(SUM(filtered_logs.reqSize) + SUM(filtered_logs.origSize)) / 1048576.00 AS ServerThroughputMB,
SUM(filtered_logs.origSize) / 1048576.00 AS OrigMB,
SUM(filtered_logs.optimizedSize) / 1048576.00 AS OptMB,
SUM(filtered_logs.reqSize) / 1048576.00 AS SentMB,
AVG(filtered_logs.compressionPct) AS CompressionAvg,
COUNT(filtered_logs) AS NumLogs;

cache_hit_logs = FILTER filtered_logs BY cacheStatus MATCHES '.*HIT.*';

grouped_cache_hit_logs = GROUP cache_hit_logs BY numDay;

cache_hits = FOREACH grouped_cache_hit_logs GENERATE group,
COUNT(cache_hit_logs) AS cnt;

final_results = JOIN results BY group, cache_hits BY group;
DUMP final_results;

(ログが定義されています。基本的には、パイプで区切られたログファイルを読み取り、フィールドを割り当てています)

ここで私がやろうとしているのは、フィールド cacheStatus に「HIT」が含まれるインスタンスの数を計算し、OrigMB、CompressionAvg、NumLogs などの他のデータも計算することです。この現在のコードは機能しますが、パフォーマンスが非常に高いようですオーバーヘッド。Pig Latin でこれに沿って何かを行う方法はありますか (MSSQL で)?

SUM(CASE CacheStatus WHEN 'HIT' THEN 1 else 0 END) as CacheHit

(基本的にログを複数回処理するのではなく、一度にまとめて処理したい)

私の質問が紛らわしい言葉で表現されている場合は申し訳ありません。私はPig Latinの初心者です。

4

1 に答える 1

5

気にしないでください、私は自分の解決策を見つけました(愚かな私、中括弧でステートメントを囲むことができることを忘れていました):

results = FOREACH grouped_logs 
{
    cache_hits = FILTER filtered_logs BY cacheStatus MATCHES '.*HIT.*';

    GENERATE group,
    (SUM(filtered_logs.reqSize) + SUM(filtered_logs.optimizedSize)) / 1048576.00 AS ClientThroughputMB,
    (SUM(filtered_logs.reqSize) + SUM(filtered_logs.origSize)) / 1048576.00 AS ServerThroughputMB,
    SUM(filtered_logs.origSize) / 1048576.00 AS OrigMB,
    SUM(filtered_logs.optimizedSize) / 1048576.00 AS OptMB,
    SUM(filtered_logs.reqSize) / 1048576.00 AS SentMB,
    AVG(filtered_logs.compressionPct) AS CompressionAvg,
    COUNT(filtered_logs) AS NumLogs,
    COUNT(cache_hits) AS CacheHit;
}
于 2011-08-02T16:30:30.193 に答える