에서의 Presto 결과의 후처리 - 처리 시간의 평균을 시계열로 출력해 본다 -
8729 단어 PHPTreasureData
어제는 사내 이벤트에서 성대하게 지고 매우 공부가 된 하루였습니다. 더 캐쉬력을 높여 가려고 생각한 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로 모은 데이터를 어떻게 가시화하는지, 라든지를 보통의 엔지니어를 기억할 수 있으면 상당히 힘들어요!
Reference
이 문제에 관하여(에서의 Presto 결과의 후처리 - 처리 시간의 평균을 시계열로 출력해 본다 -), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/chobie@github/items/73e01c1c8e4f926362f0텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)