메인 콘텐츠로 건너뛰기
Elasticsearch와 ClickHouse는 매우 다양한 데이터 타입을 지원하지만, 기본 저장 방식과 쿼리 모델은 근본적으로 다릅니다. 이 섹션에서는 일반적으로 사용되는 Elasticsearch 필드 타입을 가능한 경우 ClickHouse의 대응 타입에 매핑하고, 마이그레이션에 도움이 되는 맥락을 제공합니다. 대응되는 타입이 없는 경우에는 비고에 대안이나 참고 사항을 제공합니다.

참고 사항

  • 배열: Elasticsearch에서는 모든 필드가 배열을 네이티브하게 지원합니다. ClickHouse에서는 배열을 명시적으로 정의해야 하며(예: Array(String)), 그 대신 an_array[1]처럼 특정 위치의 값을 직접 참조하고 쿼리할 수 있습니다.
  • 다중 필드: Elasticsearch에서는 동일한 필드를 여러 방식으로 인덱싱할 수 있습니다(예: textkeyword를 모두 사용). ClickHouse에서는 이 패턴을 별도의 컬럼이나 뷰로 모델링해야 합니다.
  • 맵 및 JSON 타입 - ClickHouse에서는 Map 타입을 resourceAttributeslogAttributes와 같은 동적 키-값 구조를 모델링하는 데 일반적으로 사용합니다. 이 타입은 런타임에 임의의 키를 추가할 수 있으므로 유연한 스키마 없는 수집이 가능하며, 개념적으로는 Elasticsearch의 JSON 객체와 유사합니다. 다만, 고려해야 할 중요한 제약이 있습니다.
    • 균일한 값 타입: ClickHouse Map 컬럼은 일관된 값 타입을 가져야 합니다(예: Map(String, String)). 타입이 섞인 값은 강제 변환 없이는 지원되지 않습니다.
    • 성능 비용: Map에서 어떤 키에 접근하더라도 전체 맵을 메모리로 로드해야 하므로 성능상 비효율적일 수 있습니다.
    • 서브컬럼 부재: JSON과 달리 Map의 키는 실제 서브컬럼으로 표현되지 않으므로, ClickHouse가 이를 효율적으로 인덱싱하고 압축하며 쿼리하는 데 제약이 있습니다.
    이러한 제약 때문에 ClickStack은 Map 대신 ClickHouse의 향상된 JSON 타입으로 전환하고 있습니다. JSON 타입은 Map의 여러 한계를 해결합니다.
    • 진정한 열 지향 저장: 각 JSON 경로는 서브컬럼으로 저장되므로 압축, 필터링, 벡터화된 쿼리 실행을 효율적으로 수행할 수 있습니다.
    • 혼합 타입 지원: 서로 다른 데이터 타입(예: 정수, 문자열, 배열)이 강제 변환이나 타입 통합 없이 동일한 경로 아래 공존할 수 있습니다.
    • 파일 시스템 확장성: 동적 키(max_dynamic_paths)와 타입(max_dynamic_types)에 대한 내부 제한으로 인해, 키 집합의 카디널리티가 높더라도 디스크상의 컬럼 파일이 급증하는 것을 방지합니다.
    • 고밀도 저장: null 및 누락된 값은 불필요한 오버헤드를 피할 수 있도록 희소하게 저장됩니다. JSON 타입은 특히 관측성 워크로드에 매우 적합하며, 스키마 없는 수집의 유연성과 네이티브 ClickHouse 타입의 성능 및 확장성을 함께 제공합니다. 따라서 동적 속성 필드에서 Map을 대체하기에 이상적입니다. JSON 타입에 대한 자세한 내용은 JSON 가이드“How we built a new powerful JSON data type for ClickHouse”를 참고하십시오.
마지막 수정일 2026년 7월 2일