테이블 구성

테이블 구성 (Table Configuration)

Apache Pinot 테이블 구성 레퍼런스 문서예요. 아래 표는 테이블 수준에서 설정할 수 있는 속성을 보여줘요.

출처: 문서

본문

최상위 필드 (Top-level fields)

속성 설명
tableName 테이블의 이름을 지정해요. 영숫자, 하이픈('-'), 밑줄('_')만 포함해야 해요. (하이픈은 테이블 이름에 허용되지만 SQL 예약 문자이므로 사용하려면 쿼리에서 테이블 이름을 큰따옴표로 묶어야 해요. 이중 밑줄('__')은 Pinot의 다른 기능에 예약돼 있으므로 허용되지 않아요.)
tableType 테이블 유형을 정의해요: 오프라인 테이블은 OFFLINE, 실시간 테이블은 REALTIME. 하이브리드 테이블은 본질적으로 두 개의 테이블 구성(각 유형별 하나), 같은 테이블 이름을 가져요.
isDimTable 테이블이 차원 테이블인지 나타내는 불리언 필드
description 선택적, 사람이 읽을 수 있는 테이블 설명. 이 필드에서 Markdown을 지원해요.
tags 테이블 분류와 필터링용 선택적 태그 목록
quota 할당량 관련 속성(스토리지 할당량, 쿼리 할당량) 정의. 자세한 내용은 아래 Quota 표 참고.
task 테이블에 활성화된 minion 작업 정의. 자세한 내용은 Minion 참고.
routing broker가 라우팅할 서버를 선택하는 방법과 세그먼트 메타데이터 기반으로 broker가 세그먼트를 프루닝하는 방법을 결정하는 속성 정의. 아래 Routing 표 참고.
query 쿼리 실행 관련 속성 정의. 아래 Query 표 참고.
tableSamplers 쿼리별로 sampler 쿼리 옵션으로 선택할 수 있는 이름 있는 테이블 샘플러 정의. 아래 Table samplers 참고.
segmentsConfig 세그먼트 push 빈도, 유형, 보존, 스키마, 시간 컬럼 등 세그먼트 관련 속성 정의. 아래 segmentsConfig 표 참고.
tableIndexConfig Pinot 테이블의 인덱싱 관련 정보 정의. Table indexing config 참고.
fieldConfigList 컬럼과 해당 컬럼에 생성할 인덱스 유형 지정. Field config list 참고.
tenants 이 테이블에 사용되는 server와 broker 테넌트 정의. Tenant 참고.
ingestionConfig 데이터 수집 관련 속성 정의. ingestionConfig 참고.
upsertConfig upsert 구성 설정. Stream ingestion with upsert 참고.
dedupConfig 중복 제거 구성 설정. Stream ingestion with Dedup 참고.
dimensionTableConfig 테이블이 차원 테이블이면 메모리 절약을 위해 disablePreload를 true로 설정.
tierConfigs 계층형 스토리지 구성 정의. Tiered Storage 참고.
metadata 테이블의 기타 메타데이터 포함. 커스텀 구성을 키-값 쌍으로 담는 문자열 맵 필드 customConfigs가 있음.

2차 수준 필드 (Second-level fields)

다음 속성은 최상위 구성 안에 중첩할 수 있어요.

Quota

속성 형식 설명
storage 대소문자 구분 없는 사람이 읽을 수 있는 데이터 크기 Double + (K, M, G, T, P) 복제 전 테이블이 사용할 수 있는 최대 스토리지 공간. 예: storage가 140G이고 replication이 3이면 최대 스토리지는 140G x 3 = 420G. 이 한도에 도달하면 오프라인 세그먼트 push가 Quota check failed for segment... 메시지와 함께 403 예외를 던져요. 실시간 테이블은 정기 검증에서 초과 시 STORAGE_QUOTA_EXCEEDED 이유 코드로 소비를 일시 중지하고, 할당량 안으로 돌아오면 세그먼트 생성을 재개해요.
maxQueriesPerSecond Double 이 테이블에서 실행 가능한 초당 최대 쿼리 수. 양수 유한 값이어야 하며 0, 음수, NaN, 무한대는 거부돼요. 생략하면 쿼리 할당량이 무제한. 초과 시 429 예외와 QUERY_QUOTA_EXCEEDED BrokerMetric이 기록돼요.

쿼리 할당량에 대한 자세한 내용은 여기를 참고하세요.

Routing

라우팅 구성에 대한 자세한 내용은 여기를 참고하세요.

속성 설명
segmentPrunerTypes 활성화할 세그먼트 프루너 목록. 지원 값: partition - zookeeper에 저장된 파티션 메타데이터 기반 프루닝(기본 없음), time - timeColumnName 필터 쿼리에서 쿼리 시간 범위의 데이터가 없는 세그먼트 프루닝.
instanceSelectorType 선택된 세그먼트를 기반으로 쿼리를 서빙할 서버 인스턴스. 지원 값: balanced - 각 선택 인스턴스가 서빙하는 세그먼트 수 균형(기본), replicaGroup - 복제본 그룹 라우팅 전략용 인스턴스 선택기.

Query

속성 설명
timeoutMs 쿼리 타임아웃 (밀리초)
disableGroovy 쿼리에서 groovy 비활성화 여부. broker 인스턴스 수준 config(pinot.broker.disable.query.groovy)를 덮어써요.
useApproximateFunction 이 테이블의 single-stage 엔진에서 적격 정확 distinct-count 및 백분위 집계를 SMART 변형으로 재작성할지 여부.
expressionOverrideMap 쿼리에서 덮어쓸 표현식을 구성하는 맵. 다른 도구가 자동 생성한 쿼리 등 쿼리를 제어할 수 없을 때 유용. 예: {"myFunc(a)": "b"}.
maxQueryResponseSizeBytes 쿼리에 대한 모든 서버의 직렬화 응답 최대 크기를 나타내는 Long 값. 이 값은 쿼리를 처리하는 모든 서버에 균등하게 분배돼요.
maxServerResponseSizeBytes 쿼리당 서버별 직렬화 응답 최대 길이를 나타내는 Long 값.
maxEntriesScannedInFilter 최대 누적 numEntriesScannedInFilter 서버 측 스캔 비용에 대한 선택적 테이블별 오버라이드.
maxDocsScanned 최대 누적 numDocsScanned 서버 측 스캔 비용에 대한 선택적 테이블별 오버라이드.
maxEntriesScannedPostFilter 최대 누적 numEntriesScannedPostFilter 서버 측 스캔 비용에 대한 선택적 테이블별 오버라이드.
scanKillingMode 서버 측 스캔 기반 킬링 모드에 대한 선택적 테이블별 오버라이드. 유효 값: disabled, logOnly, enforce(대소문자 구분 없음).

Table samplers

속성 설명
name 전역 옵션에서 사용하는 샘플러 이름(예: SET sampler='small'). 테이블 구성 내에서 이름은 고유해야 해요.
type 사용할 샘플러 구현. 기본 제공 샘플러 유형, 정규화된 클래스 이름, 또는 broker 주석 스캔으로 등록된 별칭.
properties 샘플러별 문자열 맵. 지원 키는 샘플러 유형에 따라 다름.

예시:

"tableSamplers": [
  {
    "name": "small",
    "type": "firstN",
    "properties": {
      "numSegments": "1"
    }
  }
]

기본 제공 firstN 샘플러는 세그먼트 이름을 사전순으로 정렬해 처음 numSegments 항목을 유지하고, numSegments는 양의 정수여야 해요.

Segments config

속성 설명
schemaName Deprecated: 스키마 이름은 항상 테이블 이름과 일치해야 하며(유형 접미사 제외, 예: myTable) 이 필드를 구성해서는 안 돼요.
timeColumnName 이 테이블의 시간 컬럼 이름. 스키마의 시간 컬럼 이름과 일치해야 해요. push 유형 APPEND 테이블에 필수, REFRESH에는 선택. timeColumnName은 timeColumnType과 함께 세그먼트 보존과 오프라인 대 실시간 시간 경계를 관리하는 데 사용돼요.
replication 테이블의 복제본 수. replication 값 1은 세그먼트가 서버 간 복제되지 않음을 의미.
retentionTimeUnit 보존 단위(예: HOURS 또는 DAYS). retentionTimeValue와 함께 세그먼트를 보존할 기간을 결정. 예: 365 DAYS는 365일보다 오래된 데이터를 가진 세그먼트가 RetentionManager Controller 주기 작업으로 주기적으로 삭제됨. 기본적으로 보존 설정 없음.
retentionTimeValue 보존을 위한 숫자 값. retentionTimeUnit과 함께 보존 기간 결정.

Table index config

이 섹션은 일반 인덱스 구성과 Star-tree 같은 다중 컬럼 인덱스를 지정하는 데 사용돼요.

Pinot 0.13 이전에는 위 구성이 특정 단일 컬럼 인덱스 구성에도 사용됐어요. 이 방식은 여전히 지원되지만 Field Config List 섹션에서 이러한 인덱스를 지정하는 것이 권장돼요.

속성 설명
createInvertedIndexDuringSegmentGeneration DEPRECATED (Apache Pinot PR #17951): 더 이상 사용되지 않음. 역 인덱스는 항상 세그먼트 생성 중에 만들어져요.
sortedColumn 데이터에서 정렬되어 정렬 인덱스를 갖는 컬럼. 세그먼트 생성 작업이 자동으로 정렬 컬럼을 감지하므로 오프라인 테이블에는 지정할 필요 없음.
multiColumnTextIndexConfig 다중 컬럼/세그먼트별 텍스트 인덱스 구성. Text search support 참고.
starTreeIndexConfigs StarTree 인덱스 생성을 위한 StarTree 인덱싱 config 목록. StarTree Index 참고.
enableDefaultStarTree 세그먼트에 기본 StarTree 인덱스를 생성할지 나타내는 불리언. Star-Tree index 참고.
enableDynamicStarTreeCreation server가 세그먼트를 로드할 때 StarTree 생성을 허용할지 나타내는 불리언.
segmentPartitionConfig broker 측 파티션 프루닝용 컬럼별 파티션 함수 구성. segmentPartitionConfig.columnPartitionMap을 routing.segmentPrunerTypes와 함께 사용.
tierOverwrites 티어 이름 키의 선택적 JSON 객체. 해당 티어 로드 시 일치 객체를 tableIndexConfig에 병합해요.
loadMode 서버에 세그먼트를 로드하는 방법: heap - 데이터를 직접 메모리에 로드, mmap - 오프힙 메모리에 로드.
columnMinMaxValueGeneratorMode 컬럼의 min max 값 생성. 지원 값: NONE, ALL, TIME, NON_METRIC.
nullHandlingEnabled (deprecated, schema의 enableColumnBasedNullHandling 사용)
skipSegmentPreprocess 모든 서버 로드 경로에서 세그먼트 전처리를 건너뛸지 여부. true로 설정하면 기본 컬럼, 단일 컬럼 인덱스, star-tree 인덱스, 다중 컬럼 텍스트 인덱스, 컬럼 min/max 값 검사/업데이트를 하지 않아요. 기본: false. 주의해서 사용하세요.
aggregateMetrics (deprecated, Ingestion Aggregation 사용) 스트림에만 적용. 메트릭 사전 집계를 위해 true로 설정.
optimizeDictionary 단일 값 메트릭 컬럼에 사전을 비활성화하려면 true로 설정. 단일 값 컬럼에만 적용. 기본 false.
optimizeDictionaryForMetrics 단일 값 메트릭 컬럼에 사전 비활성화. 단일 값 메트릭 컬럼에만 적용. 기본 false.
optimizeDictionaryType true이면 세그먼트의 모든 값이 같은 길이일 때 STRING, BYTES, BIG_DECIMAL 컬럼에 고정 폭 사전을 자동 선택. 기본 false.
noDictionarySizeRatioThreshold optimizeDictionaryForMetrics 활성화 시 noDictionaryIndexSize/indexWithDictionarySize가 이 임계값 미만인 메트릭 컬럼에 사전 미생성. 기본 0.85.
noDictionaryCardinalityRatioThreshold optimizeDictionary 활성화 시 cardinality / totalDocs 비율이 이 임계값 미만인 컬럼에는 여전히 사전 생성. 0.1(10%) 정도가 합리적 시작점. 기본 미설정(비활성화).
columnMajorSegmentBuilderEnabled 세그먼트 구축 성능을 향상시킬 수 있는 컬럼-메이저 세그먼트 빌딩 활성화 불리언. 기본 true.
segmentNameGeneratorType segmentNameGenerator 유형, 기본은 SimpleSegmentNameGenerator. #segment-name-generator-spec 참고.
Segment partition config

broker가 파티션 컬럼 기반으로 세그먼트를 프루닝하려면 tableIndexConfig.segmentPartitionConfig.columnPartitionMap을 routing.segmentPrunerTypes: ["partition"]과 함께 사용하세요.

upsert 또는 dedup 활성 테이블의 경우 Pinot은 segmentPartitionConfig를 추가/제거/수정하는 테이블 구성 업데이트를 거부해요. 파티션 구성을 변경하면 같은 기본 키를 가진 레코드가 다른 파티션이나 서버로 보내져 중복이나 잘못된 쿼리 결과가 생길 수 있어요. 파티션 함수와 파티션 수를 테이블 생성 전에 계획하세요.

columnPartitionMap의 각 항목은 하나의 컬럼을 구성해요:

속성 설명
functionName 파티션 함수 이름. 매칭 대소문자 구분 없음. 기본 제공: Modulo, Murmur, Murmur3, FNV, HashCode, ByteArray, BoundedColumnValue. Murmur2는 Murmur의 별칭.
numPartitions 컬럼의 총 파티션 수.
functionConfig 함수별 설정을 담는 선택적 문자열 맵.

기본 제공 파티션 함수는 다음 기본값을 사용해요:

함수 별칭 기본 partitionIdNormalizer 함수별 config
Modulo 없음 POSITIVE_MODULO 없음
Murmur Murmur2 MASK useRawBytes
Murmur3 없음 MASK seed, variant (x86_32, x64_32), useRawBytes
FNV 없음 MASK variant (fnv1_32, fnv1a_32, fnv1_64, fnv1a_64), useRawBytes
HashCode 없음 PRE_MODULO_ABS 없음
ByteArray 없음 PRE_MODULO_ABS 없음
BoundedColumnValue 없음 NO_OP columnValues, columnValuesDelimiter

partitionIdNormalizer는 BoundedColumnValue를 제외한 모든 기본 제공 함수의 공유 config 키예요. 지원 값: POSITIVE_MODULO, ABS, MASK, PRE_MODULO_ABS, NO_OP.

BoundedColumnValue는 구성된 값을 고정 파티션 ID에 매핑하고 일치하지 않는 모든 값을 파티션 0으로 보내요. numPartitions은 구성된 값 수 + 1로 설정하세요.

예시:

{
  "tableIndexConfig": {
    "segmentPartitionConfig": {
      "columnPartitionMap": {
        "memberId": {
          "functionName": "FNV",
          "numPartitions": 16,
          "functionConfig": {
            "variant": "fnv1a_32",
            "partitionIdNormalizer": "ABS"
          }
        },
        "subject": {
          "functionName": "BoundedColumnValue",
          "numPartitions": 4,
          "functionConfig": {
            "columnValues": "Maths|English|Chemistry",
            "columnValuesDelimiter": "|"
          }
        }
      }
    }
  }
}

Pinot은 더 이상 닫힌 PartitionFunctionFactory enum을 사용하지 않아요. 커스텀 파티션 함수는 org.apache.pinot.* 아래의 public, concrete PartitionFunction 구현으로 (int numPartitions, Map<String, String> functionConfig) public 생성자가 있을 때 시작 시 발견돼요.

Field Config List

컬럼과 해당 컬럼에 생성할 인덱스 유형을 지정해요.

속성 설명
name 컬럼의 이름
encodingType RAW 또는 DICTIONARY 중 하나
indexes 키가 인덱스를 식별하는 객체. 값은 각 인덱스의 구성으로 해석.
tierOverwrites 티어 이름 키의 선택적 JSON 객체. 해당 티어의 필드 구성에 병합.
timestampConfig timestamp 인덱스에 사용되는 세분성을 정의하는 객체
properties 인덱스와 관련된 추가 속성을 담는 키-값 쌍의 JSON.

encodingType이 RAW이면 forward index는 원시 값을 저장해요. 컬럼은 다른 필드 수준 인덱스가 사전 ID나 사전 값을 요구하면 여전히 사전을 가질 수 있어요. 구성 업데이트의 경우 indexes.dictionary에서 해당 사전을 명시적으로 만들고 legacy tableIndexConfig.noDictionaryColumns/noDictionaryConfig에서 컬럼을 유지하지 마세요.

RAW forward index + 독립 사전 예시:

{
  "fieldConfigList": [
    {
      "name": "myColumn",
      "encodingType": "RAW",
      "indexes": {
        "dictionary": {},
        "inverted": {}
      }
    }
  ]
}
OPEN_STRUCT 인덱스

단일 값 OPEN_STRUCT 컬럼에서 open_struct 필드 수준 인덱스를 사용하면 하나의 컬럼에 반구조화 객체를 유지하면서 자주 사용하는 키를 표준 Pinot 컬럼으로 구체화할 수 있어요.

Pinot은 OPEN_STRUCT 데이터를 두 계층으로 저장해요:

  • Dense 키는 <column>$<key>라는 구체화된 자식 컬럼이 됨.
  • 나머지 키는 <column>$__sparse__라는 하나의 희소 JSON 컬럼에 기록.

open_struct config 객체는 다음 속성을 지원해요:

속성 설명
denseKeys 채움 비율과 무관하게 Pinot이 항상 dense 자식 컬럼으로 구체화하는 선택적 명시적 키 집합.
ignoredKeys 수집 중 버릴 선택적 키 집합. 요청 불가. denseKeys, valueFieldConfigs, 스키마의 childFieldSpecs에 나타날 수 없음. 새로 수집된 데이터에만 영향.
denseKeyMinFillRate Pinot이 자동 구체화 전에 문서가 키를 포함해야 하는 최소 비율. 기본 0.5.
maxDenseKeys 구체화할 dense 키 최대 수. -1 무제한, 0 dense 키 비활성화, 양수는 최고 채움 비율 키만 dense로 유지.
sparseJsonIndex 공유 희소 컬럼에 JSON 인덱스 구축 여부. 기본 false.
perKeyMetricsEnabled 밀봉 세그먼트에서 발견된 모든 키에 OPEN_STRUCT_LAST_SEGMENT_KEY_DOC_COUNT 방출 여부. 기본 false.
defaultValueFieldConfig valueFieldConfigs에 나타나지 않는 dense 키에 적용되는 선택적 폴백 FieldConfig.
valueFieldConfigs 키별 FieldConfig 항목의 선택적 목록. 각 항목의 name은 OPEN_STRUCT 키 이름과 일치해야 함.

defaultValueFieldConfig 또는 valueFieldConfigs 안의 키별 FieldConfig.indexes는 검증된 부분집합(dictionary, forward, inverted, range, bloom)만 사용할 수 있어요. forward 인덱스는 구체화된 자식 컬럼에 항상 기록돼요.

예시:

{
  "fieldConfigList": [
    {
      "name": "attributes",
      "indexes": {
        "open_struct": {
          "denseKeys": ["customerId", "country"],
          "ignoredKeys": ["debug", "internalTrace"],
          "denseKeyMinFillRate": 0.5,
          "maxDenseKeys": 32,
          "sparseJsonIndex": true,
          "perKeyMetricsEnabled": false,
          "valueFieldConfigs": [
            { "name": "customerId", "indexes": { "inverted": {} } },
            { "name": "country", "indexes": { "bloom": {} } }
          ]
        }
      }
    }
  ]
}

실시간 테이블의 경우 지속 세그먼트 형식을 바꾸지 않고 가변 소비 세그먼트에 다른 인덱스 레이아웃을 줄 수도 있어요. Pinot은 consuming 오버라이드를 먼저 적용하고, 일반 테이블 구성 경로를 통해 유효 구성을 검증한 다음, 세그먼트가 여전히 소비 중인 동안에만 그 유효 뷰를 사용해요:

{
  "tableIndexConfig": {
    "noDictionaryColumns": ["profiledString"],
    "tierOverwrites": {
      "consuming": { "noDictionaryColumns": [] }
    }
  },
  "fieldConfigList": [
    {
      "name": "profiledString",
      "encodingType": "RAW",
      "tierOverwrites": {
        "consuming": {
          "encodingType": "DICTIONARY",
          "indexes": { "inverted": { "disabled": false } }
        }
      }
    }
  ]
}

가변 소비 세그먼트가 사전 기반 역 인덱스 같은 추가 인덱스를 노출하도록 하려면 이 패턴을 사용하세요. 행 형태 설정은 기본 구성에 두고, 의도한 스토리지 티어 동작이 아니면 consuming이라는 실제 tierConfigs 항목을 정의하지 마세요.

Deprecated 구성 옵션

Pinot에는 여전히 지원되지만 새로운 구성 방식으로 마이그레이션하는 것이 권장되는 여러 deprecated 구성 옵션이 있어요:

indexTypes - 컬럼에 대해 활성화된 인덱스를 정의하는 옛 방식. 지원 유형: Text, FST, Timestamp, H3 (지리공간).

indexType - indexTypes와 유사하지만 문자열로 단일 인덱스 유형만 지원. 둘 다 있으면 후자는 무시돼요.

compressionCodec - 인덱스 압축 지정의 옛 방식. 이제 forward index config에서 지정 권장.

Deprecated properties - Pinot 0.13 이전에는 특정 인덱스가 이 섹션의 properties로 구성됐어요. 0.13부터 각 인덱스는 indexes 객체의 전용 섹션에서 타입 세이프하게 구성할 수 있어요.

경고: 다중값(MV) 컬럼의 forward 인덱스를 재생성하기 위해 위 forwardIndexDisabled 속성을 제거하면 다음 불변식이 유지될 수 없어요: 행 내 MV 값의 순서 보장, MV 행 내 중복 항목의 중복 유실. 중복이 있는 원래 MV 데이터를 복구하려면 오프라인 작업으로 세그먼트를 재생성하고 push/새로고침하세요.

실시간 테이블 구성 (Real-time table config)

아래 섹션은 실시간 테이블에만 적용돼요.

segmentsConfig

속성 설명
replicasPerPartition (Deprecated, replication 사용) 스트림의 파티션별 복제본 수
completionMode 세그먼트를 다른 서버에서 다운로드할지 메모리에서 구축할지 결정. DOWNLOAD 또는 비어 있을 수 있음
peerSegmentDownloadScheme 서버에서 세그먼트를 다운로드할 프로토콜. http 또는 https 중 하나

Indexing config

streamConfigs 섹션은 릴리스 0.7.0부터 deprecated됐어요. streamConfigMaps를 대신 참고하세요.

Tenants

속성 설명
broker 세그먼트가 위치해야 하는 broker 테넌트
server 세그먼트가 위치해야 하는 server 테넌트
tagOverrideConfig 특정 조건을 충족하면 세그먼트의 테넌트를 덮어써요. 현재 realtimeConsuming 또는 realtimeCompleted 오버라이드만 지원.

환경 변수 오버라이드 (Environment variables override)

Pinot은 사용자가 테이블 구성의 필드 값으로 ${ENV_NAME} 또는 ${ENV_NAME:DEFAULT_VALUE} 형식의 환경 변수를 정의할 수 있게 해요. Pinot 인스턴스는 런타임 중 이를 덮어써요.

테이블을 생성하거나 업데이트할 때 controller는 이제 테이블 구성에 저장하기 전에 이러한 플레이스홀더를 자체 런타임 환경에 대해 검증해요. 기본값 없는 플레이스홀더가 해석되지 않으면 Pinot은 쓰기를 거부해요.

환경 변수 정의 시 대괄호가 필요해요. "$ENV_NAME"은 지원되지 않아요.

테이블 구성에서 기본값 없이 사용되는 환경 변수는 Controller, Broker, Server, Minion 등 모든 Pinot 구성 요소에서 사용할 수 있어야 해요. 그렇지 않으면 해당 변수를 사용할 수 없는 서비스에 따라 쿼리/소비가 영향받아요.

아래는 환경 변수를 사용해 테이블 구성의 일부로 AWS 자격증명을 설정하는 예시예요.

샘플 구성 (Sample configurations)

오프라인 테이블

아래 예시는 친숙함을 위해 일부 레거시 구성 패턴을 사용해요. 새 테이블 구성에서는 tableIndexConfig의 invertedIndexColumns, rangeIndexColumns, bloomFilterColumns 등 대신 fieldConfigList와 indexes 객체를 사용하는 것을 선호하세요. segmentsConfig의 timeType 필드도 deprecated이며 스키마의 dateTimeFieldSpec에 시간 형식을 정의하세요.

"OFFLINE": {
  "tableName": "pinotTable",
  "tableType": "OFFLINE",
  "quota": {
    "maxQueriesPerSecond": 300,
    "storage": "140G"
  },
  "routing": {
    "segmentPrunerTypes": ["partition"],
    "instanceSelectorType": "replicaGroup"
  },
  "segmentsConfig": {
    "timeColumnName": "daysSinceEpoch",
    "timeType": "DAYS",
    "replication": "3",
    "retentionTimeUnit": "DAYS",
    "retentionTimeValue": "365"
  },
  "tableIndexConfig": {
    "invertedIndexColumns": ["foo", "bar", "moo"],
    "createInvertedIndexDuringSegmentGeneration": false,
    "sortedColumn": ["pk"],
    "bloomFilterColumns": [],
    "starTreeIndexConfigs": [],
    "noDictionaryColumns": [],
    "rangeIndexColumns": [],
    "onHeapDictionaryColumns": [],
    "varLengthDictionaryColumns": [],
    "segmentPartitionConfig": {
      "columnPartitionMap": {
        "column_foo": {
          "functionName": "Murmur",
          "numPartitions": 32
        }
      }
    },
    "loadMode": "MMAP",
    "columnMinMaxValueGeneratorMode": null,
    "nullHandlingEnabled": false
  },
  "ingestionConfig": {
    "batchIngestionConfig": {
      "segmentIngestionType": "APPEND",
      "segmentIngestionFrequency": "DAILY"
    },
    "filterConfig": {
      "filterFunction": "Groovy({foo == \"VALUE1\"}, foo)"
    },
    "transformConfigs": [
    {
      "columnName": "bar",
      "transformFunction": "lower(moo)"
    },
    {
      "columnName": "hoursSinceEpoch",
      "transformFunction": "toEpochHours(millis)"
    }]
  },
  "tenants": {
    "broker": "myBrokerTenant",
    "server": "myServerTenant"
  },
  "metadata": {
    "customConfigs": {
      "key": "value"
    }
  }
}

실시간 테이블

아래는 실시간 테이블용 예시 테이블 구성이에요. 오프라인 테이블 구성의 모든 필드는 실시간 테이블에도 유효해요. 추가로 실시간 테이블은 몇 가지 추가 필드를 사용해요.

realtime.segment.flush.threshold.rows, realtime.segment.flush.threshold.time, realtime.segment.flush.threshold.segment.size 같은 flush 키는 ingestionConfig.streamIngestionConfig.streamConfigMaps 아래에 있어요. Realtime segment flush threshold precedence와 Ingestion stream configs 참고.

"REALTIME": {
  "tableName": "pinotTable",
  "tableType": "REALTIME",
  "segmentsConfig": {
    "timeColumnName": "daysSinceEpoch",
    "timeType": "DAYS",
    "replication": "3",
    "retentionTimeUnit": "DAYS",
    "retentionTimeValue": "5",
    "completionConfig": {
      "completionMode": "DOWNLOAD"
    }
  },
  "tableIndexConfig": {
    "invertedIndexColumns": ["foo", "bar", "moo"],
    "sortedColumn": ["column1"],
    "noDictionaryColumns": ["metric1", "metric2"],
    "loadMode": "MMAP",
    "nullHandlingEnabled": false
  },
  "ingestionConfig": {
    "streamIngestionConfig": {
      "streamConfigMaps": [
      {
        "realtime.segment.flush.threshold.rows": "0",
        "realtime.segment.flush.threshold.time": "24h",
        "realtime.segment.flush.threshold.segment.size": "150M",
        "stream.kafka.broker.list": "XXXX",
        "stream.kafka.consumer.factory.class.name": "XXXX",
        "stream.kafka.consumer.prop.auto.offset.reset": "largest",
        "stream.kafka.decoder.class.name": "XXXX",
        "stream.kafka.decoder.prop.schema.registry.rest.url": "XXXX",
        "stream.kafka.decoder.prop.schema.registry.schema.name": "XXXX",
        "stream.kafka.topic.name": "XXXX",
        "streamType": "kafka"
      }]
    }
  },
  "tenants":{
    "broker": "myBrokerTenant",
    "server": "myServerTenant",
    "tagOverrideConfig": {}
  },
  "metadata": {}
}

더 알아보기 (Learn more)