쿼리 그래뉼래리티(Query granularities)
쿼리 그래뉼래리티(Query granularities)
Apache Druid는 Druid SQL과 네이티브 쿼리 두 가지 쿼리 언어를 지원해요. 이 문서는 네이티브 언어를 설명합니다. Granularity는 시간 차원에서 데이터를 어떻게 버킷으로 나눌지, 즉 데이터를 시간, 일, 분 단위 등으로 어떻게 집계하고 저장할지를 결정해요.
출처: 문서
본문
Granularity는 시간 차원에서 데이터를 어떻게 버킷으로 나눌지, 즉 시간, 일, 분 단위 등으로 데이터를 어떻게 집계하고 저장할지 결정합니다. 여기의 granularity 형식은 수집 스펙의 granularitySpec 섹션에 있는 segmentGranularity와 queryGranularity에도 적용됩니다. 예를 들어 네이티브 쿼리에서 시간 granularity를 사용해 결과를 시간별로 버킷에 넣고, 수집 스펙의 dataSchema \ granularitySpec 섹션에서 유입되는 데이터를 세그먼트화할 수 있어요. 시간 기간은 단순 문자열, 밀리초 단위의 기간, 임의의 ISO8601 기간으로 지정할 수 있습니다.
단순 그래뉼래리티(Simple Granularities)
단순 granularity는 문자열로 지정되며, 타임스탬프를 UTC 시간으로 버킷 처리합니다(예: 일은 00:00 UTC에 시작). Druid는 다음 granularity 문자열을 지원합니다:
allnonesecondminutefive_minuteten_minutefifteen_minutethirty_minutehoursix_houreight_hourdayweek*monthquarteryear
최소와 최대 granularity는 각각 none과 all이며, 다음과 같이 설명됩니다:
all은 모든 것을 단일 버킷으로 버킷 처리합니다.none은 버킷 처리를 하지 않는다는 뜻이 아닙니다. 내부 인덱스의 granularity인 밀리초 granularity로 데이터를 버킷 처리합니다.none을millisecond와 동등하다고 생각하면 돼요.
timeseries 쿼리에서 none을 사용하지 마세요. Druid가 빈 내부 시간 버킷을 0으로 채우므로, 출력에 요청된 interval의 매 밀리초마다 결과가 포함될 것입니다. *수집 시 파티셔닝에는 week granularity 사용을 피하세요. 주(week)가 월(year)과 깔끔하게 맞지 않아, 나중에 더 거친 granularity로 파티셔닝하기 어렵기 때문입니다.
예시:
다음 데이터가 밀리초 수집 granularity로 Apache Druid에 저장되어 있다고 가정해 봅시다.
{"timestamp": "2013-08-31T01:02:33Z", "page": "AAA", "language" : "en"}
{"timestamp": "2013-09-01T01:02:33Z", "page": "BBB", "language" : "en"}
{"timestamp": "2013-09-02T23:32:45Z", "page": "CCC", "language" : "en"}
{"timestamp": "2013-09-03T03:32:45Z", "page": "DDD", "language" : "en"}
hour granularity로 groupBy 쿼리를 제출하면,
{
"queryType":"groupBy",
"dataSource":"my_dataSource",
"granularity":"hour",
"dimensions":[
"language"
],
"aggregations":[
{
"type":"count",
"name":"count"
}
],
"intervals":[
"2000-01-01T00:00Z/3000-01-01T00:00Z"
]
}
다음을 얻게 됩니다:
[ {
"version" : "v1",
"timestamp" : "2013-08-31T01:00:00.000Z",
"event" : {
"count" : 1,
"language" : "en"
}
}, {
"version" : "v1",
"timestamp" : "2013-09-01T01:00:00.000Z",
"event" : {
"count" : 1,
"language" : "en"
}
}, {
"version" : "v1",
"timestamp" : "2013-09-02T23:00:00.000Z",
"event" : {
"count" : 1,
"language" : "en"
}
}, {
"version" : "v1",
"timestamp" : "2013-09-03T03:00:00.000Z",
"event" : {
"count" : 1,
"language" : "en"
}
} ]
모든 빈 버킷은 버려진다는 점을 주목하세요.
granularity를 day로 바꾸면 다음을 얻게 됩니다:
[ {
"version" : "v1",
"timestamp" : "2013-08-31T00:00:00.000Z",
"event" : {
"count" : 1,
"language" : "en"
}
}, {
"version" : "v1",
"timestamp" : "2013-09-01T00:00:00.000Z",
"event" : {
"count" : 1,
"language" : "en"
}
}, {
"version" : "v1",
"timestamp" : "2013-09-02T00:00:00.000Z",
"event" : {
"count" : 1,
"language" : "en"
}
}, {
"version" : "v1",
"timestamp" : "2013-09-03T00:00:00.000Z",
"event" : {
"count" : 1,
"language" : "en"
}
} ]
granularity를 none으로 바꾸면, 수집 granularity로 설정한 것과 같은 결과를 얻습니다.
[ {
"version" : "v1",
"timestamp" : "2013-08-31T01:02:33.000Z",
"event" : {
"count" : 1,
"language" : "en"
}
}, {
"version" : "v1",
"timestamp" : "2013-09-01T01:02:33.000Z",
"event" : {
"count" : 1,
"language" : "en"
}
}, {
"version" : "v1",
"timestamp" : "2013-09-02T23:32:45.000Z",
"event" : {
"count" : 1,
"language" : "en"
}
}, {
"version" : "v1",
"timestamp" : "2013-09-03T03:32:45.000Z",
"event" : {
"count" : 1,
"language" : "en"
}
} ]
수집 시 설정된 queryGranularity 파라미터보다 작은 쿼리 시간 granularity를 가지는 것은 비합리적입니다. 그보다 작은 granularity에 대한 정보는 인덱싱된 데이터에 없기 때문입니다. 따라서 쿼리 시간 granularity가 수집 시간 query granularity보다 작다면, Druid는 granularity를 queryGranularity로 설정한 것과 동등한 결과를 생성합니다.
granularity를 all로 바꾸면 모든 것이 1개의 버킷으로 집계됩니다:
[ {
"version" : "v1",
"timestamp" : "2000-01-01T00:00:00.000Z",
"event" : {
"count" : 4,
"language" : "en"
}
} ]
Duration Granularities
Duration granularity는 밀리초로 된 정확한 기간으로 지정되며, 타임스탬프는 UTC로 반환됩니다. Duration granularity 값은 밀리초 단위입니다. 시간 버킷을 세기 시작할 위치를 정의하는 선택적 origin도 지원합니다(기본값은 1970-01-01T00:00:00Z).
{"type": "duration", "duration": 7200000}
이것은 2시간마다 청크로 나눕니다.
{"type": "duration", "duration": 3600000, "origin": "2012-01-01T00:30:00Z"}
이것은 30분마다 시간 청크로 나눕니다.
예시:
이전 예시의 데이터를 재사용해 24시간 duration으로 groupBy 쿼리를 제출하면,
{
"queryType":"groupBy",
"dataSource":"my_dataSource",
"granularity":{"type": "duration", "duration": "86400000"},
"dimensions":[
"language"
],
"aggregations":[
{
"type":"count",
"name":"count"
}
],
"intervals":[
"2000-01-01T00:00Z/3000-01-01T00:00Z"
]
}
granularity의 origin을 2012-01-01T00:30:00Z로 설정하면,
"granularity":{"type": "duration", "duration": "86400000", "origin":"2012-01-01T00:30:00Z"}
[ {
"version" : "v1",
"timestamp" : "2013-08-31T00:30:00.000Z",
"event" : {
"count" : 1,
"language" : "en"
}
}, {
"version" : "v1",
"timestamp" : "2013-09-01T00:30:00.000Z",
"event" : {
"count" : 1,
"language" : "en"
}
}, {
"version" : "v1",
"timestamp" : "2013-09-02T00:30:00.000Z",
"event" : {
"count" : 1,
"language" : "en"
}
}, {
"version" : "v1",
"timestamp" : "2013-09-03T00:30:00.000Z",
"event" : {
"count" : 1,
"language" : "en"
}
} ]
각 버킷의 타임스탬프가 30분부터 시작한다는 점을 주목하세요.
Period Granularities
Period granularity는 연, 월, 주, 시, 분, 초의 임의 기간 조합(예: P2W, P3M, PT1H30M, PT0.750S)을 ISO8601 형식으로 지정합니다. 기간 경계가 시작되는 위치와 반환되는 타임스탬프의 타임존을 결정하는 time zone 지정을 지원합니다. 기본적으로 origin이 지정되지 않으면 연은 1월 1일에, 월은 월의 1일에, 주는 월요일에 시작합니다.
Time zone은 선택 사항입니다(기본값은 UTC). Origin은 선택 사항입니다(주어진 타임존에서 기본값은 1970-01-01T00:00:00).
{"type": "period", "period": "P2D", "timeZone": "America/Los_Angeles"}
이것은 태평양 타임존에서 2일 청크로 버킷 처리합니다.
{"type": "period", "period": "P3M", "timeZone": "America/Los_Angeles", "origin": "2012-02-01T00:00:00-08:00"}
이것은 3개월 분기가 2월부터 시작하는 것으로 정의된 태평양 타임존에서 3개월 청크로 버킷 처리합니다.
예시
이전 예시의 데이터를 재사용해, 태평양 타임존에서 1일 period로 groupBy 쿼리를 제출하면,
{
"queryType":"groupBy",
"dataSource":"my_dataSource",
"granularity":{"type": "period", "period": "P1D", "timeZone": "America/Los_Angeles"},
"dimensions":[
"language"
],
"aggregations":[
{
"type":"count",
"name":"count"
}
],
"intervals":[
"1999-12-31T16:00:00.000-08:00/2999-12-31T16:00:00.000-08:00"
]
}
[ {
"version" : "v1",
"timestamp" : "2013-08-30T00:00:00.000-07:00",
"event" : {
"count" : 1,
"language" : "en"
}
}, {
"version" : "v1",
"timestamp" : "2013-08-31T00:00:00.000-07:00",
"event" : {
"count" : 1,
"language" : "en"
}
}, {
"version" : "v1",
"timestamp" : "2013-09-02T00:00:00.000-07:00",
"event" : {
"count" : 2,
"language" : "en"
}
} ]
각 버킷의 타임스탬프가 태평양 시간으로 변환되었음을 주목하세요. 행 {"timestamp": "2013-09-02T23:32:45Z", "page": "CCC", "language" : "en"}과 {"timestamp": "2013-09-03T03:32:45Z", "page": "DDD", "language" : "en"}은 태평양 시간에서 같은 날에 속하므로 같은 버킷에 들어갔습니다. 또한 groupBy 쿼리의 intervals는 지정된 타임존으로 변환되지 않으며, granularity에서 지정된 타임존은 쿼리 결과에만 적용된다는 점을 주목하세요.
granularity의 origin을 1970-01-01T20:30:00-08:00으로 설정하면,
"granularity":{"type": "period", "period": "P1D", "timeZone": "America/Los_Angeles", "origin": "1970-01-01T20:30:00-08:00"}
[ {
"version" : "v1",
"timestamp" : "2013-08-29T20:30:00.000-07:00",
"event" : {
"count" : 1,
"language" : "en"
}
}, {
"version" : "v1",
"timestamp" : "2013-08-30T20:30:00.000-07:00",
"event" : {
"count" : 1,
"language" : "en"
}
}, {
"version" : "v1",
"timestamp" : "2013-09-01T20:30:00.000-07:00",
"event" : {
"count" : 1,
"language" : "en"
}
}, {
"version" : "v1",
"timestamp" : "2013-09-02T20:30:00.000-07:00",
"event" : {
"count" : 1,
"language" : "en"
}
} ]
지정한 origin은 타임존과 관계가 없으며, 첫 번째 granularity 버킷을 찾기 위한 시작점 역할만 한다는 점을 주목하세요. 이 경우 행 {"timestamp": "2013-09-02T23:32:45Z", "page": "CCC", "language" : "en"}과 {"timestamp": "2013-09-03T03:32:45Z", "page": "DDD", "language" : "en"}은 같은 버킷에 있지 않습니다.
지원되는 타임존
Timezone 지원은 표준 IANA 타임존을 사용하는 Joda Time 라이브러리가 제공합니다. Joda Time supported timezones를 참고하세요.
더 알아보기 (Learn more)
- Granularity: Druid granularity 전반에 대한 개념.
- 네이티브 쿼리: groupBy, timeseries 등 쿼리에서 granularity 사용.
- SQL 시간 함수: Druid SQL에서의 시간 함수.