Условная сумма по данным с использованием Apache Pig Latin - PullRequest
2 голосов
/ 02 августа 2011

Я пытаюсь выполнить некоторую обработку журналов, используя 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.

1 Ответ

5 голосов
/ 02 августа 2011

Неважно, я нашел свое собственное решение (глупый я, забыл, что я могу просто заключить утверждения в фигурные скобки):

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;
}
...