bin 명령
bin 명령
bin 명령은 숫자 값을 동일한 간격의 버킷으로 그룹화해요. 히스토그램을 만들고 데이터 분포를 분석할 때 유용해요. 숫자 또는 시간 기반 필드를 받아 각 버킷의 하한을 나타내는 값을 포함하는 새 필드를 생성해요.
출처: 문서
본문
구문(Syntax)
bin 명령은 다음과 같은 구문을 가져요.
bin <field> [span=<interval>] [minspan=<interval>] [bins=<count>] [aligntime=(earliest | latest | <time-specifier>)] [start=<value>] [end=<value>]
매개변수(Parameters)
bin 명령은 다음 매개변수를 지원해요.
| Parameter | Required/Optional | Description |
|---|---|---|
<field> |
Required | 버킷으로 그룹화할 필드. 숫자 또는 시간 기반 필드를 받아요. |
span |
Optional | 각 빈의 간격 크기. bins 또는 minspan 매개변수와 함께 사용할 수 없어요. 숫자, 로그(log10, 2log10), 시간 간격을 지원해요. 시간 단위 참조. |
minspan |
Optional | 자동 span 계산을 위한 최소 간격 크기. span 또는 bins 매개변수와 함께 사용할 수 없어요. |
bins |
Optional | 만들 동일 너비 빈의 최대 개수. 2에서 50000(포함) 사이여야 해요. span 또는 minspan 매개변수와 함께 사용할 수 없어요. 타임스탬프 필드용 bins 매개변수 참조. |
aligntime |
Optional | 시간 기반 필드의 빈 시간을 정렬해요. 시간 기반 이산화에서만 유효해요. 유효한 값은 earliest, latest 또는 특정 시간이에요. 정렬 옵션 참조. |
start |
Optional | 간격 범위의 시작 값. 기본값은 필드의 최솟값이에요. |
end |
Optional | 간격 범위의 끝 값. 기본값은 필드의 최댓값이에요. |
타임스탬프 필드용 bins 매개변수
타임스탬프 필드의 bins 매개변수는 다음 요구 사항이 있어요.
- Push-down이 활성화되어야 함:
plugins.calcite.pushdown.enabled를true(기본 활성화)로 설정해 push-down을 활성화해요. push-down이 비활성화되면 대신span매개변수를 사용해요(예:bin @timestamp span=5m). - 타임스탬프 필드를 집계 버킷으로 사용해야 함: 빈(binned) 타임스탬프 필드는
stats집계에 포함되어야 해요(예:source=events | bin @timestamp bins=3 | stats count() by @timestamp). 집계 버킷 밖에서 타임스탬프 필드에bins를 사용하는 것은 지원되지 않아요.
시간 단위(Time units)
span 매개변수에 사용할 수 있는 시간 단위는 다음과 같아요.
- 마이크로초(
us) - 밀리초(
ms) - 센티초(
cs) - 데시초(
ds) - 초(
s,sec,secs,second, 또는seconds) - 분(
m,min,mins,minute, 또는minutes) - 시간(
h,hr,hrs,hour, 또는hours) - 일(
d,day, 또는days) - 월(
M,mon,month, 또는months)
시간 정렬 옵션(Align time options)
aligntime 매개변수에 사용할 수 있는 옵션은 다음과 같아요.
earliest– 데이터의 가장 이른 타임스탬프에 빈을 정렬해요.latest– 데이터의 가장 최신 타임스탬프에 빈을 정렬해요.<time-specifier>– 특정 epoch 시간 값이나 시간 수정자 표현식에 빈을 정렬해요.
매개변수 동작(Parameter behavior)
여러 매개변수가 지정되면 우선순위는 span > minspan > bins > start/end > 기본값 순이에요.
특수 매개변수 유형(Special parameter types)
bin 명령은 특정 매개변수 유형에 대해 다음과 같은 특수 처리가 있어요.
- 로그 간격(예:
log10또는2log10)은 선형 대신 로그 빈 경계를 만들어요. - 일별 또는 월별 간격은 자동으로 달력 경계에 정렬되고 타임스탬프 대신 날짜 문자열(
YYYY-MM-DD)을 반환해요. aligntime매개변수는 하루보다 짧은 시간 간격에만 적용돼요(일별 또는 월별 간격 제외).start및end매개변수는 범위를 확장하며(절대 줄이지 않음) 빈 너비 계산에 영향을 줘요.
예시 1: 로그의 응답 시간 분포
source=otellogs
| rex field=body "(?<duration>\d+)ms"
| bin duration span=100
| stats count() as request_count by duration
| sort duration
이 쿼리는 다음과 같은 결과를 반환해요.
| request_count | duration |
|---|---|
| 17 | null |
| 1 | 0-100 |
| 1 | 30000-30100 |
| 1 | 3200-3300 |
예시 2: 심각도 수준 분포
source=otellogs
| bin severityNumber span=5
| stats count() as log_count by severityNumber
| sort severityNumber
이 쿼리는 다음과 같은 결과를 반환해요.
| log_count | severityNumber |
|---|---|
| 4 | 10-15 |
| 7 | 15-20 |
| 9 | 5-10 |
예시 3: 로그 간격(log10)
source=accounts
| bin balance span=log10
| fields balance
| head 2
이 쿼리는 다음과 같은 결과를 반환해요.
| balance |
|---|
| 10000.0-100000.0 |
| 1000.0-10000.0 |
예시 4: 계수가 있는 로그 간격
source=accounts
| bin balance span=2log10
| fields balance
| head 3
이 쿼리는 다음과 같은 결과를 반환해요.
| balance |
|---|
| 20000.0-200000.0 |
| 2000.0-20000.0 |
| 20000.0-200000.0 |
예시 5: 기본 bins 매개변수
source=time_test
| bin value bins=5
| fields value
| head 3
이 쿼리는 다음과 같은 결과를 반환해요.
| value |
|---|
| 8000-9000 |
| 7000-8000 |
| 9000-10000 |
예시 6: bins 매개변수를 사용한 로그 볼륨 분포
source=otellogs
| stats count() as volume by `resource.attributes.service.name`
| bin volume bins=4
| stats count() as service_count by volume
| sort volume
이 쿼리는 다음과 같은 결과를 반환해요.
| service_count | volume |
|---|---|
| 1 | 1-2 |
| 1 | 2-3 |
| 3 | 3-4 |
| 2 | 4-5 |
예시 7: 많은 빈 개수
source=accounts
| bin age bins=21
| fields age, account_number
| head 3
이 쿼리는 다음과 같은 결과를 반환해요.
| age | account_number |
|---|---|
| 32-33 | 1 |
| 36-37 | 6 |
| 28-29 | 13 |
예시 8: 기본 minspan
source=accounts
| bin age minspan=5
| fields age, account_number
| head 3
이 쿼리는 다음과 같은 결과를 반환해요.
| age | account_number |
|---|---|
| 30-40 | 1 |
| 30-40 | 6 |
| 20-30 | 13 |
예시 9: 큰 minspan
source=accounts
| bin age minspan=101
| fields age
| head 1
이 쿼리는 다음과 같은 결과를 반환해요.
| age |
|---|
| 0-1000 |
예시 10: start 및 end 범위
source=accounts
| bin age start=0 end=101
| fields age
| head 1
이 쿼리는 다음과 같은 결과를 반환해요.
| age |
|---|
| 0-100 |
예시 11: 큰 end 범위
source=accounts
| bin balance start=0 end=100001
| fields balance
| head 1
이 쿼리는 다음과 같은 결과를 반환해요.
| balance |
|---|
| 0-100000 |
예시 12: start/end가 있는 span
source=accounts
| bin age span=1 start=25 end=35
| fields age
| head 6
이 쿼리는 다음과 같은 결과를 반환해요.
| age |
|---|
| 32-33 |
| 36-37 |
| 28-29 |
| 33-34 |
예시 13: 시간 간격
source=time_test
| bin @timestamp span=1h
| fields @timestamp, value
| head 3
이 쿼리는 다음과 같은 결과를 반환해요.
| @timestamp | value |
|---|---|
| 2025-07-28 00:00:00 | 8945 |
| 2025-07-28 01:00:00 | 7623 |
| 2025-07-28 02:00:00 | 9187 |
예시 14: 분 간격
source=time_test
| bin @timestamp span=45minute
| fields @timestamp, value
| head 3
이 쿼리는 다음과 같은 결과를 반환해요.
| @timestamp | value |
|---|---|
| 2025-07-28 00:00:00 | 8945 |
| 2025-07-28 01:30:00 | 7623 |
| 2025-07-28 02:15:00 | 9187 |
예시 15: 초 간격
source=time_test
| bin @timestamp span=30seconds
| fields @timestamp, value
| head 3
이 쿼리는 다음과 같은 결과를 반환해요.
| @timestamp | value |
|---|---|
| 2025-07-28 00:15:30 | 8945 |
| 2025-07-28 01:42:00 | 7623 |
| 2025-07-28 02:28:30 | 9187 |
예시 16: 일별 간격
source=time_test
| bin @timestamp span=7day
| fields @timestamp, value
| head 3
이 쿼리는 다음과 같은 결과를 반환해요.
| @timestamp | value |
|---|---|
| 2025-07-24 00:00:00 | 8945 |
| 2025-07-24 00:00:00 | 7623 |
| 2025-07-24 00:00:00 | 9187 |
예시 17: 시간 수정자로 시간 정렬
source=time_test
| bin @timestamp span=2h aligntime='@d+3h'
| fields @timestamp, value
| head 3
이 쿼리는 다음과 같은 결과를 반환해요.
| @timestamp | value |
|---|---|
| 2025-07-27 23:00:00 | 8945 |
| 2025-07-28 01:00:00 | 7623 |
| 2025-07-28 01:00:00 | 9187 |
예시 18: epoch 타임스탬프로 시간 정렬
source=time_test
| bin @timestamp span=2h aligntime=1500000000
| fields @timestamp, value
| head 3
이 쿼리는 다음과 같은 결과를 반환해요.
| @timestamp | value |
|---|---|
| 2025-07-27 22:40:00 | 8945 |
| 2025-07-28 00:40:00 | 7623 |
| 2025-07-28 00:40:00 | 9187 |
예시 19: 기본 동작(매개변수 없음)
source=accounts
| bin age
| fields age, account_number
| head 3
이 쿼리는 다음과 같은 결과를 반환해요.
| age | account_number |
|---|---|
| 32.0-33.0 | 1 |
| 36.0-37.0 | 6 |
| 28.0-29.0 | 13 |
예시 20: 문자열 필드 빈 만들기
source=accounts
| eval age_str = CAST(age AS STRING)
| bin age_str bins=3
| stats count() by age_str
| sort age_str
이 쿼리는 다음과 같은 결과를 반환해요.
| count() | age_str |
|---|---|
| 1 | 20-30 |
| 3 | 30-40 |