멀티-밸류 차원

멀티-밸류 차원 (Multi-value dimensions)

Druid는 문자열 컬럼 하나에 여러 값을 저장할 수 있는 멀티-밸류 차원(multi-value string dimension)을 지원해요. 이 차원이 필터·집계·SQL에서 어떻게 동작하는지 자세히 살펴볼게요.

출처: 문서

본문

Druid의 native 차원 타입 시스템은 세그먼트 안에서 문자열 컬럼이 여러 값을 가질 수 있게 해요. 멀티-밸류 문자열 차원에 있는 각 행은 문자열 값의 배열을 포함해요. 예를 들어 한 사용자가 여러 태그나 여러 관심사를 가질 수 있어요.

멀티-밸류 차원은 native 쿼리와 Druid SQL 양쪽에서 사용할 수 있어요. SQL에서 멀티-밸류 차원은 VARCHAR 타입으로 보고되고, 멀티-밸류 문자열 함수를 사용하면 배열처럼 다룰 수 있어요.

쿼리에서의 동작 (Behavior in queries)

필터 (Filters)

멀티-밸류 차원에 대한 selector 필터는 행의 값 중 하나가 필터 값과 일치하면 그 행을 일치하는 것으로 처리해요. 즉 값 배열의 어떤 요소라도 일치하면 돼요. in 필터도 같은 방식으로 동작해요.

그룹화 (Grouping)

GROUP BY에서 멀티-밸류 차원으로 그룹화하면, Druid는 암시적 UNNEST처럼 동작해요. 각 행의 각 멀티-밸류 값이 별도의 행으로 그룹화돼요. 행이 여러 값을 가지면 각 값이 하나의 그룹에 나타나요.

집계 (Aggregations)

멀티-밸류 차원에 대한 집계는 각 값에 대해 수행돼요. 예를 들어 COUNT 집계에서 멀티-밸류 행이 가진 각 값이 집계에 기여해요.

SQL 함수 (SQL functions)

Druid SQL은 멀티-밸류 차원을 다루는 특수 함수를 제공해요. 보통 MV_ 접두사가 붙어요:

  • MV_TO_ARRAY(mv): 멀티-밸류 차원을 ARRAY로 변환.
  • ARRAY_TO_MV(arr): 배열을 멀티-밸류 차원으로 변환.
  • MV_LENGTH(mv): 값의 개수.
  • MV_OFFSET(mv, n): 0 기반 인덱스의 n번째 값.
  • MV_SLICE(mv, start, end): 값의 부분 배열.
  • MV_FILTER(mv, filter) 또는 MV_FILTER_ONLY 등: 조건으로 값을 필터링.
  • MV_CONTAINS(mv, val): 값 포함 여부.
  • MV_OVERLAP(mv1, mv2): 값이 겹치는지 여부.

이 함수들은 ARRAY 타입에서 동작하는 배열 함수들과 유사하게 동작하지만, VARCHAR 타입을 유지해요.

주의할 점 (Notes)

  • 멀티-밸류 차원을 필터링할 때 = 'a' AND = 'b' 같은 표현식은 SQL 플래너가 잘못 최적화해 false로 만들어버릴 수 있어요 (실제로 한 행이 두 값을 다 가질 수 있음). 이는 SQL 플래너가 멀티-밸류 차원을 단일 VARCHAR로 취급하기 때문이에요.
  • 멀티-밸류 차원의 특성을 활용하려면 SQL보다 native 쿼리가 더 정확할 수 있고, 멀티-밸류 문자열 함수를 사용하는 것이 안전해요.

더 알아보기 (Learn more)

  • SQL 배열 함수 — 멀티-밸류 차원을 배열로 변환해 쓰는 함수를 살펴보세요.
  • SQL 데이터 타입 — 멀티-밸류 문자열과 배열의 타입 차이를 알아보세요.
  • 인제스트 스펙 — 멀티-밸류 차원을 정의하는 방법을 살펴보세요.