중첩 컬럼

중첩 컬럼 (Nested columns)

Druid는 native COMPLEX<json> 타입으로 세그먼트에 중첩된 JSON 데이터 구조를 저장하고 쿼리할 수 있어요. 이 문서는 중첩 컬럼을 인제스트하고, JSON 함수로 쿼리하고, 성능을 다루는 방법을 설명할게요.

출처: 문서

본문

Druid는 native COMPLEX<json> 타입을 사용해 세그먼트에 중첩된 데이터 구조를 저장하는 것을 지원해요. 중첩 컬럼을 사용하면 데이터를 로드할 때 전체 중첩 객체를 "펼치지(flatten)" 않고도 질의할 수 있어요. 이는 복잡한 JSON을 다룰 때 스키마를 단순화하고 유연성을 높여줘요.

중첩 컬럼 사용하기 (Using nested columns)

중첩 컬럼은 인제스트할 때 JSON 데이터가 포함된 입력을 COMPLEX<json> 컬럼으로 저장해서 사용할 수 있어요. 예를 들어 ingestion spec에서 JSON을 flatten하지 않고 그대로 중첩 컬럼에 담을 수 있어요.

COMPLEX<json> 컬럼에는 JSON 객체, 배열, 스칼라 값이 저장될 수 있어요. 중첩 구조는 클 수 있고 몇 단계로 중첩될 수 있어요.

샘플 중첩 데이터:

{
  "user_id": 123,
  "location": {
    "city": "Seoul",
    "coordinates": { "lat": 37.5, "lon": 127.0 }
  },
  "tags": ["a", "b", "c"]
}

JSON 함수로 쿼리하기 (Querying with JSON functions)

중첩 컬럼은 JSON 함수 로 쿼리할 수 있어요. 주요 함수:

  • JSON_KEYS(expr, [path]): 지정된 위치의 키 목록.
  • JSON_PATHS(expr): 모든 중첩 경로 목록.
  • JSON_VALUE(expr, [path]): 경로의 값 (문자열처럼 단순 타입으로).
  • JSON_QUERY(expr, [path]): 경로의 JSON (복합 타입으로 반환).
  • JSON_OBJECT(...): JSON 객체 생성.
  • JSON_ARRAY(...): JSON 배열 생성.
  • PARSE_JSON(string): 문자열을 COMPLEX<json>으로 파싱.
  • TO_JSON_STRING(expr): COMPLEX<json>을 JSON 문자열로 직렬화.

예를 들어 중첩 데이터에서 location.city 값을 얻으려면:

SELECT JSON_VALUE(location_col, '$.location.city') AS city FROM my_table

jq 문법을 지원해 배열 인덱싱과 중첩 경로를 유연하게 다룰 수 있어요.

인제스트 (Ingestion)

중첩 컬럼은 JSON 기반 인제스트(예: index_parallel, MSQ 등)에서 입력 JSON을 flatten하지 않고 COMPLEX<json>으로 저장하면 돼요. 스키마가 자동 탐지되는 경우 COMPLEX<json> 컬럼으로 감지될 수 있어요. 필요하면 flattenSpec 대신 중첩 컬럼을 명시적으로 구성할 수 있어요.

SQL에서의 중첩 컬럼 동작 (Nested columns in SQL)

Druid SQL에서 중첩 컬럼은 COMPLEX<json> 타입으로 표현돼요. JSON 함수를 SELECT 절과 WHERE 절에서 사용할 수 있어요. GROUP BY나 필터 등 일반 연산에 COMPLEX 값을 직접 쓰는 것은 제한돼요.

성능 고려사항 (Performance considerations)

중첩 컬럼은 유연하지만, 중첩 구조에 대한 쿼리는 캐싱과 인덱싱 측면에서 평평한(flat) 컬럼보다 효율이 낮을 수 있어요. 자주 쿼리하는 경로는 별도의 평평한 컬럼으로 미리 추출해 두면 성능을 높일 수 있어요.

더 알아보기 (Learn more)

  • JSON 함수 — 중첩 컬럼을 다루는 JSON 함수 전체를 살펴보세요.
  • SQL 데이터 타입 — COMPLEX<json> 타입에 대해 알아보세요.
  • 인제스트 — 중첩 JSON을 인제스트하는 방법을 살펴보세요.