에서의 Presto 결과의 후처리 - 처리 시간의 평균을 시계열로 출력해 본다 -

8729 단어 PHPTreasureData
글쎄, 하루가 늦었지만 AdventCalendar 5 일째입니다.

어제는 사내 이벤트에서 성대하게 지고 매우 공부가 된 하루였습니다. 더 캐쉬력을 높여 가려고 생각한 30세·겨울.
지갑에는 천엔밖에 없었던 외로움을 극복하고 오늘도 긍정적으로 가고 싶습니다.

전회는 특정 구간의 처리 시간을 percentile로 출력해, 어쩐지 파악해 보자고 하는 것을 했습니다.
그룹핑의 조건도 특정 액션마다의 집계이었기 때문에 레인지가 길어질수록 대규모가 되어 버립니다.

그런 처리 시간을 시각화하고 싶다는 것은 뭔가 이상한 일이 일어나지 않았는지 알고 싶다는 것이기 때문에
오늘은 1일마다 그리고 액션마다 처리 시간의 평균을 집계해, 일자순으로 나란히 해 봅시다. 그렇게 하면 더 변화량이 시각적으로 알기 쉬워집니다.

테이블 구성은 이전과 동일하다고 가정합니다.
select 
    TD_TIME_FORMAT(time, 'yyyy-MM-dd', 'JST') as day, 
    action, 
    avg(elapsed) as average
from 
    access_log
where 
    TD_TIME_RANGE(time, '2014-11-01 00:00', '2014-11-7 23:59:59', 'JST')
group by 
    TD_TIME_FORMAT(time, 'yyyy-MM-dd', 'JST'),
    action

이것으로 날짜·페이지명·처리 시간 평균이라는 결과를 얻을 수 있게 되었습니다만 이대로는 그래프에 그리기 어려우므로 후처리를 합니다.
여기등은 무엇이든 좋기 때문에 좋아하는 언어나 자랑스러운 언어로 쓰면 좋다고 생각합니다.

이 분야는 R을 사용하는 편이 단연 편합니다만, PHP에서도 정리해 두면 의외로 실용적이므로 이런 재료를 기억해 두면 운용에 도움이 되기도 합니다.
<?php
$data = file_get_contents("a.dat");
$keys = array();
$result = array();
$devs = array();

foreach(explode("\n", $data) as $line) {
    $line = trim($line);
    if (empty($line)) {
        continue;
    }
    $args = explode("\t", $line);
    $result[$args[1]][$args[0]] = $args[2];
    $keys[$args[0]] = $args[0];
}

// 日付     ページ名...
// yyymmdd 平均値...
// というように出力しやすいように積み直しつつデータに抜けがある場合は0を入れる
$rows = array();
foreach ($keys as $d) {
    $tmp = array();
    foreach ($result as $act => $v) {
        if (isset($v[$d])) {
            $tmp[] = $v[$d];
        } else {
            $tmp[] = 0.0;
        }
    }
    $rows[$d] = $tmp;
}

//出力
echo "date\t" . join("\t", array_keys($result)) . PHP_EOL;
foreach ($rows as $d => $row) {
    printf("%s\t%s\n", $d, join("\t", $row));
}

이제 출력 결과를 그래프에 쓰면 이런 식으로 됩니다.



왓, 항목수가 많아서 읽기 힘들다…

그럴 때는 표준편차를 계산하여 편차가 큰 것만을 표시해 보면 됩니다.
표준편차의 계산방법은 평균의 차이를 자승하여 더한 것을 요소수로 나눈 것을 sqrt 해 준다.
function stddev($values) {
    $avg =  array_sum($values) / count($values));
    $r = 0.0;
    foreach ($values as $val) {
        $r += pow($val - $avg, 2);
    }
    return sqrt($r / count($values));
}

Presto 측에서도 stddev 함수 등이 있으므로 미리 계산할 수는 있습니다만, 이렇게 나중에 보고 하는 것도 즐거운 것입니다.
표준편차가 일정치 이상의 페이지를 표시한 것이 다음의 그래프입니다.



상당히 쉬워졌습니다.

이런 느낌으로 처리 결과를 엄청나게 필터하고 다시 써 넣어 가면, 누구라도 알아차리는 것은 기계에 맡겨 가자, 사람은 더 멋진 아이디어라든지 판단을 할 수 있도록 주력하자고 할 수 있기 때문에 마침내 좋을 것입니다.

그래, 이것이 TreasureData에 상관없이 왜? 아니, 이렇게 TreasureData로 모은 데이터를 어떻게 가시화하는지, 라든지를 보통의 엔지니어를 기억할 수 있으면 상당히 힘들어요!

좋은 웹페이지 즐겨찾기