세그먼트 메타데이터 쿼리

세그먼트 메타데이터 쿼리 (Segment metadata query)

세그먼트 메타데이터 쿼리는 세그먼트에 대한 정보(저장된 행 수, 커버하는 interval, 크기, 롤업 여부, 컬럼별 정보 등)를 반환하는 native 전용 쿼리 타입이에요.

출처: 문서

본문

Apache Druid는 두 가지 쿼리 언어를 지원해요: Druid SQL 과 native 쿼리. 이 문서는 native 언어에서만 사용할 수 있는 쿼리 타입을 설명해요. 하지만 Druid SQL에는 metadata tables 에 비슷한 기능이 있어요.

세그먼트 메타데이터 쿼리는 다음에 대한 세그먼트별(per-segment) 정보를 반환해요:

  • 세그먼트 안에 저장된 행 수
  • 세그먼트가 커버하는 interval
  • 'flat format'(예: CSV 파일)으로 저장된 경우의 추정 총 세그먼트 바이트 크기
  • 세그먼트 id
  • 세그먼트가 롤업(rolled up)되었는지 여부
  • 타입, 카디널리티, min/max 값, null 값 존재 여부, 추정 'flat format' 바이트 크기 같은 컬럼별 상세 정보
{
  "queryType": "segmentMetadata",
  "dataSource": "sample_datasource",
  "intervals": ["2013-01-01/2014-01-01"]
}

세그먼트 메타데이터 쿼리의 주요 부분은 몇 가지가 있어요:

| 속성 | 설명 | 필수? | | queryType | 이 String은 항상 "segmentMetadata"이어야 해요. Apache Druid가 쿼리를 해석하는 방법을 알아내기 위해 가장 먼저 보는 값이에요. | 예 | | dataSource | 쿼리할 데이터 소스를 정의하는 String 또는 Object. 관계형 데이터베이스의 테이블과 매우 유사해요. 자세한 내용은 DataSource 를 참고하세요. | 예 | | intervals | ISO-8601 Intervals를 나타내는 JSON Object. 쿼리를 실행할 시간 범위를 정의해요. | 아니요 | | toInclude | 결과에 포함할 컬럼을 나타내는 JSON Object. 기본값은 "all"예요. | 아니요 | | merge | 모든 개별 세그먼트 메타데이터 결과를 단일 결과로 병합할지 여부. | 아니요 | | context | Context 참고 | 아니요 | | analysisTypes | 카디널리티·크기 같은 어떤 컬럼 속성을 계산해 결과에 반환할지 지정하는 String 목록. 기본값은 ["cardinality", "interval", "minmax"] 이지만, segment metadata query config 를 사용해 재정의할 수 있어요. 자세한 내용은 analysisTypes 섹션을 참고하세요. | 아니요 | | aggregatorMergeStrategy | Druid가 세그먼트 간에 집계자를 병합하는 데 사용하는 전략. true이고 aggregators 분석 타입이 활성화되어 있으면 aggregatorMergeStrategy의 기본값은 strict예요. 가능한 값은 strict, lenient, earliest, latest 예요. 자세한 내용은 aggregatorMergeStrategy 를 참고하세요. | 아니요 | | lenientAggregatorMerge | 더 이상 사용되지 않음(deprecated). 대신 aggregatorMergeStrategy 속성을 사용하세요. true이고 aggregators 분석 타입이 활성화되어 있으면 Druid가 집계자를 느슨하게(leniently) 병합해요. | 아니요 |

결과 형식은 다음과 같아요:

[
  {
    "id": "some_id",
    "intervals": [ "2013-05-13T00:00:00.000Z/2013-05-14T00:00:00.000Z" ],
    "columns": {
      "__time": { "type": "LONG", "hasMultipleValues": false, "hasNulls": false, "size": 407240380, "cardinality": null, "errorMessage": null },
      "dim1": { "type": "STRING", "hasMultipleValues": false, "hasNulls": false, "size": 100000, "cardinality": 1944, "errorMessage": null },
      "dim2": { "type": "STRING", "hasMultipleValues": true, "hasNulls": true, "size": 100000, "cardinality": 1504, "errorMessage": null },
      "metric1": { "type": "FLOAT", "hasMultipleValues": false, "hasNulls": false, "size": 100000, "cardinality": null, "errorMessage": null }
    },
    "aggregators": {
      "metric1": { "type": "longSum", "name": "metric1", "fieldName": "metric1" }
    },
    "queryGranularity": {
      "type": "none"
    },
    "size": 300000,
    "numRows": 5000000
  }
]

모든 컬럼은 Druid가 컬럼 타입 정보를 내부적으로 표현하는 데 사용하는 typeSignature를 포함해요. typeSignature는 보통 쿼리나 인제스트 시간에 JSON 타입 정보를 식별하는 데 사용되는 값과 동일해요. 그중 하나: STRING, FLOAT, DOUBLE, LONG, 또는 COMPLEX<typeName>, 예: COMPLEX<hyperUnique>.

컬럼은 또한 레거시 타입 이름(legacy type name)을 가져요. 일부 컬럼 타입에서는 값이 typeSignature(STRING, FLOAT, DOUBLE, LONG)와 일치할 수 있어요. COMPLEX 컬럼의 경우 타입은 hyperUnique 같은 기본 복합 타입의 이름만 포함해요.

새 애플리케이션은 type이 아니라 typeSignature를 사용해야 해요.

errorMessage 필드가 null이 아니면 응답의 다른 필드는 신뢰하지 마세요. 그 내용은 정의되지 않아요.

사전 인코딩된(dictionary encoded) 컬럼(즉 타입이 STRING인 컬럼)만 카디널리티를 가져요. 나머지 컬럼(타임스탬프와 메트릭 컬럼)은 카디널리티가 null 로 표시돼요.

intervals

interval을 지정하지 않으면 쿼리는 가장 최근 세그먼트의 종료 시간 이전의 구성 가능한 기간을 아우르는 기본 interval을 사용해요.

이 기본 시간 기간의 길이는 Broker 구성에서 설정돼요: druid.query.segmentMetadata.defaultHistory

toInclude

toInclude 객체에는 3가지 타입이 있어요.

All

문법은 다음과 같아요:

"toInclude": { "type": "all" }

None

문법은 다음과 같아요:

"toInclude": { "type": "none" }

List

문법은 다음과 같아요:

"toInclude": { "type": "list", "columns": [<string list of column names>] }

analysisTypes

이것은 컬럼에 대해 수행할 분석, 즉 컬럼에 대해 반환되는 정보의 양을 결정하는 속성 목록이에요.

기본적으로 "cardinality", "interval", "minmax" 타입이 사용돼요. 필요하지 않은 속성은 이 목록에서 생략하면 더 효율적인 쿼리가 돼요.

기본 분석 타입은 Broker 구성에서 설정할 수 있어요: druid.query.segmentMetadata.defaultAnalysisTypes

컬럼 분석 타입은 아래에 설명돼요:

cardinality

  • cardinality는 문자열 컬럼에 존재하는 고유 값의 수예요. 다른 컬럼 타입에서는 null 이에요.

Druid는 문자열 컬럼 사전의 크기를 검사해 cardinality 값을 계산해요. 세그먼트당 컬럼당 사전이 하나 있어요. merge가 꺼져 있으면(false) 각 세그먼트의 각 컬럼 카디널리티를 개별적으로 보고해요. merge가 켜져 있으면(true) 관련된 모든 세그먼트에서 특정 컬럼에 대해 마주친 가장 높은 카디널리티를 보고해요.

minmax

  • 각 컬럼에 대한 추정 min/max 값. 문자열 컬럼에만 보고돼요.

size

  • size는 데이터가 텍스트 형식으로 저장된 경우의 추정 총 바이트 크기예요. Druid에서 컬럼의 실제 저장 크기는 아니에요. 세그먼트의 실제 바이트 단위 저장 크기를 원한다면 다른 곳을 보세요. 몇 가지 안내:

    • 전체 세그먼트의 저장 크기(바이트)를 얻으려면 sys.segments 테이블 의 size 필드를 확인하세요. 이것은 메모리 매핑 가능한 콘텐츠의 크기예요.
    • 특정 세그먼트의 특정 컬럼 저장 크기(바이트)를 얻으려면 세그먼트를 풀고 아카이브 안의 meta.smoosh 파일을 보세요. 세 번째와 네 번째 컬럼의 차이가 바이트 단위 크기예요. 현재 이 정보를 검색하는 API는 없어요.

interval

  • 결과의 intervals는 쿼리된 세그먼트와 연관된 interval 목록을 포함해요.

timestampSpec

  • 결과의 timestampSpec는 세그먼트에 저장된 데이터의 timestampSpec을 포함해요. 세그먼트의 timestampSpec을 알 수 없거나 병합할 수 없으면 (병합이 활성화된 경우) null 일 수 있어요.

queryGranularity

  • 결과의 queryGranularity는 세그먼트에 저장된 데이터의 쿼리 세분성을 포함해요. 세그먼트의 쿼리 세분성을 알 수 없거나 병합할 수 없으면 (병합이 활성화된 경우) null 일 수 있어요.

aggregators

  • 결과의 aggregators는 메트릭 컬럼을 쿼리하는 데 사용할 수 있는 집계자 목록을 포함해요. 집계자를 알 수 없거나 병합할 수 없으면 (병합이 활성화된 경우) null 일 수 있어요.
  • 병합은 strict, lenient, earliest, latest 가 될 수 있어요. 자세한 내용은 aggregatorMergeStrategy 를 참고하세요.
  • 결과의 형태는 컬럼 이름을 집계자로 매핑한 맵이에요.

rollup

  • 결과의 rollup은 true/false/null이에요.
  • 병합이 활성화되어 있을 때 일부는 rollup이고 일부는 아니면 결과는 null이에요.

projections

  • 결과의 projections는 세그먼트의 프로젝션 목록을 포함해요.
  • 충돌하는 프로젝션이 식별되면 충돌하는 프로젝션은 제외되고, 충돌하지 않는 프로젝션은 포함돼요.

aggregatorMergeStrategy

일부 세그먼트에 알려지지 않은 집계자가 있거나, 두 세그먼트가 같은 컬럼에 호환되지 않는 집계자를 사용하는 경우(예: longSum이 doubleSum으로 바뀐 경우) 세그먼트 간의 집계자 메타데이터 충돌이 발생할 수 있어요. Druid는 다음 집계자 병합 전략을 지원해요:

  • strict : 알 수 없는 집계자가 있는 세그먼트가 있거나 어떤 종류의 충돌이든 있으면 병합된 집계자 목록은 null 이에요.
  • lenient : Druid는 알 수 없는 집계자가 있는 세그먼트를 무시해요. 집계자 간 충돌은 특정 컬럼의 집계자를 null로 설정해요.
  • earliest : 세그먼트 간 충돌이 발생하면 Druid는 특정 컬럼에 대해 가장 오래된 세그먼트의 집계자를 선택해요.
  • latest : 세그먼트 간 충돌이 발생하면 Druid는 특정 컬럼에 대해 가장 최근 세그먼트의 집계자를 선택해요.

lenientAggregatorMerge (deprecated)

더 이상 사용되지 않음(deprecated). 대신 aggregatorMergeStrategy를 사용하세요.

더 알아보기 (Learn more)