통계 애그리게이터

통계 애그리게이터 (Stats aggregator)

이 Apache Druid 확장은 분산(variance)과 표준 편차(standard deviation) 등을 포함한 통계 관련 애그리게이터를 제공해요. 확장 로드 목록에 반드시 druid-stats를 포함해야 합니다.

출처: 문서

본문

분산 애그리게이터 (Variance aggregator)

애그리게이터의 알고리즘은 apache hive의 것과 동일해요. 다음은 hive의 GenericUDAFVariance에 대한 설명입니다.

Chan, Golub, and LeVeque의 "Algorithms for computing the sample variance: analysis and recommendations" The American Statistician, 37 (1983) pp. 242--247에 기술된 알고리즘으로 분산을 계산합니다.

variance = variance1 + variance2 + n/(m*(m+n)) * pow(((m/n)*t1 - t2),2)

여기서:

  • variance는 sum(x-avg^2) (실제로는 분산의 n배)이며 매 단계마다 갱신됩니다.
  • n은 chunk1의 요소 개수
  • m은 chunk2의 요소 개수
  • t1은 chunk1의 요소 합
  • t2는 chunk2의 요소 합

이 알고리즘은 J.L. Barlow의 "Error analysis of a pairwise summation algorithm to compute sample variance" Numer. Math, 58 (1991) pp. 583--590에서 수치적으로 안정적임이 입증되었습니다.

정보

모든 애그리게이터와 마찬가지로, 세그먼트를 가로지르는 연산 순서는 비결정적(non-deterministic)이에요. 즉 이 애그리게이터가 "float" 또는 "double" 입력 타입으로 동작하면, 쿼리를 여러 번 실행했을 때 집계 결과가 정확히 같지 않을 수 있습니다.

일관된 결과를 얻으려면 분산을 고정된 소수 자릿수로 반올림해서, 쿼리 실행 간에 결과가 정확히 같게 만드세요.

분산과 표준 편차 SQL 애그리게이터

분산·표준 편차 집계 함수는 어떤 Druid SQL 쿼리의 SELECT 절에서도 사용할 수 있어요.

| Function | Notes | Default | | VAR_POP(expr) | expr의 모분산(population variance) 계산 | null | | VAR_SAMP(expr) | expr의 표본분산(sample variance) 계산 | null | | VARIANCE(expr) | expr의 표본분산 계산 | null | | STDDEV_POP(expr) | expr의 모표준편차 계산 | null | | STDDEV_SAMP(expr) | expr의 표본표준편차 계산 | null | | STDDEV(expr) | expr의 표본표준편차 계산 | null |

수집 시점에 분산을 사전 집계하기

이 기능을 사용하려면 인덱싱 시점에 "variance" 애그리게이터가 포함돼야 해요. 수집 애그리게이터는 숫자 값에만 적용할 수 있습니다. "variance"를 사용하면 값이 없는 입력 행은 값이 0인 것으로 간주됩니다.

수집에 대해 기대 입력 타입은 "float", "double", "long", "variance" 중 하나로 지정할 수 있고, 기본값은 "float"예요.

{  "type" : "variance",  "name" : <output_name>,  "fieldName" : <metric_name>,  "inputType" : <input_type>,  "estimator" : <string>}

결과를 쿼리하려면 "variance" 입력 타입의 "variance" 애그리게이터나 간단히 "varianceFold" 애그리게이터를 쿼리에 포함해야 합니다.

{  "type" : "varianceFold",  "name" : <output_name>,  "fieldName" : <metric_name>,  "estimator" : <string>}

| Property | Description | Default | | estimator | 기본값인 variance_sample 대신 variance_pop을 얻으려면 "population"으로 설정 | null |

표준 편차 포스트 애그리게이터

분산에서 표준 편차를 얻으려면 "stddev" 포스트 애그리게이터를 사용할 수 있어요.

{  "type": "stddev",  "name": "<output_name>",  "fieldName": "<aggregator_name>",  "estimator": <string>}

쿼리 예시:

Timeseries 쿼리

Druid SQL

SELECT   DATE_TRUNC('day', __time),  VARIANCE("index_var") AS index_varFROM "testing"WHERE TIME_IN_INTERVAL(__time, '2013-03-01/2016-03-20')GROUP BY 1

Native Query

{  "queryType": "timeseries",  "dataSource": "testing",  "granularity": "day",  "aggregations": [    {      "type": "variance",      "name": "index_var",      "fieldName": "index_var"    }  ],  "intervals": [    "2016-03-01/2013-03-20"  ]}

TopN 쿼리

Druid SQL

SELECT  alias,  VARIANCE("index") AS index_varFROM "testing"WHERE TIME_IN_INTERVAL(__time, '2016-03-06/2016-03-07')GROUP BY 1ORDER BY 2LIMIT 5

Native Query

{  "queryType": "topN",  "dataSource": "testing",  "dimensions": ["alias"],  "threshold": 5,  "granularity": "all",  "aggregations": [    {      "type": "variance",      "name": "index_var",      "fieldName": "index"    }  ],  "postAggregations": [    {      "type": "stddev",      "name": "index_stddev",      "fieldName": "index_var"    }  ],  "intervals": [    "2016-03-06/2016-03-07"  ]}

GroupBy 쿼리

Druid SQL

SELECT  alias,  VARIANCE("index") AS index_varFROM "testing"WHERE TIME_IN_INTERVAL(__time, '2016-03-06/2016-03-07')GROUP BY alias

Native Query

{  "queryType": "groupBy",  "dataSource": "testing",  "dimensions": ["alias"],  "granularity": "all",  "aggregations": [    {      "type": "variance",      "name": "index_var",      "fieldName": "index"    }  ],  "postAggregations": [    {      "type": "stddev",      "name": "index_stddev",      "fieldName": "index_var"    }  ],  "intervals": [    "2016-03-06/2016-03-07"  ]}

더 알아보기 (Learn more)