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

더 알아보기 (Learn more)