스키마
스키마 (Schema)
Apache Pinot의 스키마 구성 요소를 살펴보는 페이지예요. 스키마는 Pinot 테이블의 구조와 데이터 타입을 정의하는 데 필수적이며, 효율적인 데이터 처리와 분석을 가능하게 해줘요.
출처: Schema
본문
Pinot의 각 테이블은 스키마와 연결돼요. 스키마는 다음을 정의해요:
- 테이블의 필드와 그 데이터 타입.
- 테이블이 칼럼 기반(column-based) 또는 테이블 기반 null 처리를 사용하는지. 자세한 내용은 Null value support 참조.
스키마는 테이블 설정과 함께 Zookeeper에 저장돼요.
💡 Pinot의 스키마 이름은 일반적인 데이터베이스 테이블 명명 규칙을 따르며, 예를 들어 이름을 문자로 시작하고 밑줄로 끝나지 않으며 영숫자만 사용해요.
카테고리 (Categories)
스키마는 또한 칼럼이 어떤 카테고리에 속하는지 정의해요. Pinot 테이블의 칼럼은 세 가지 카테고리로 나눌 수 있어요:
| 카테고리 | 설명 |
|---|---|
| Dimension | Dimension 칼럼은 일반적으로 비즈니스 쿼리에 답하는 slice and dice 연산에 사용됨. dimension 칼럼이 사용되는 일부 연산: - GROUP BY - 하나 이상의 dimension 칼럼으로 그룹화하고 하나 이상의 metric 칼럼에 대한 집계 함께 수행 - WHERE 같은 필터 절 |
| Metric | 이 칼럼들은 테이블의 정량적 데이터를 나타냄. 이런 칼럼은 집계에 사용됨. 데이터 웨어하우스 용어로 fact 또는 measure 칼럼이라고도 함. metric 칼럼이 사용되는 일부 연산: - 집계 - SUM, MIN, MAX, COUNT, AVG 등 - WHERE 같은 필터 절 |
| DateTime | 이 칼럼은 데이터의 시간 칼럼을 나타냄. 테이블에 여러 시간 칼럼이 있을 수 있지만 그중 하나만 기본(primary)으로 취급될 수 있음. 기본 시간 칼럼은 segment config에 존재하는 칼럼임. 기본 시간 칼럼은 Pinot가 하이브리드 테이블에서 오프라인과 실시간 데이터 사이의 시간 경계를 유지하고 보존 관리를 하는 데 사용됨. 테이블의 푸시 유형이 APPEND면 기본 시간 칼럼이 필수이고, REFRESH면 선택적임. 시간 칼럼에서 할 수 있는 일반적인 연산: - GROUP BY - WHERE 같은 필터 절 |
Pinot는 칼럼이 이러한 카테고리 중 어느 것에 속하는지에 대한 엄격한 규칙을 강요하지 않아요. 오히려 카테고리는 Pinot에 내부 최적화를 하라는 힌트로 생각할 수 있어요.
예를 들어 metric은 딕셔너리 없이 저장될 수 있고 다른 기본 null 값을 가질 수 있어요.
카테고리는 세그먼트 병합과 롤업을 할 때도 관련이 있어요. Pinot는 merge/rollups를 적용할 레코드를 식별하는 데 dimension과 time 필드를 사용해요.
Metric 집계는 Pinot가 dimension과 time을 키로 사용하고 metric 칼럼의 값을 자동으로 집계하는 또 다른 예시예요.
설정에 대한 자세한 내용은 Schema configuration reference를 참조하세요.
날짜 및 시간 필드 (Date and time fields)
Pinot는 전용 DATETIME 데이터 타입을 지원하지 않기 때문에 시간을 STRING, LONG, INT 형식으로 입력해야 해요. 하지만 연산을 하려면 Pinot가 날짜를 epoch 타임스탬프 같은 이해 가능한 형식으로 변환해야 해요. 지원되는 형식에 대한 자세한 내용은 DateTime field spec configs를 참조하세요.
스키마 생성 (Creating a schema)
먼저 클러스터가 실행 중인지 확인하세요.
스키마를 만들어 JSON 파일에 넣어 보겠습니다. 이 예제에서는 비행 데이터에 대한 스키마를 만들었어요.
💡 스키마 파일 구성에 대한 자세한 내용은 Schema configuration reference를 참조하세요.
{
"schemaName": "flights",
"enableColumnBasedNullHandling": true,
"dimensionFieldSpecs": [
{
"name": "flightNumber",
"dataType": "LONG",
"notNull": true
},
{
"name": "tags",
"dataType": "STRING",
"singleValueField": false,
"defaultNullValue": "null"
}
],
"metricFieldSpecs": [
{
"name": "price",
"dataType": "DOUBLE",
"notNull": true,
"defaultNullValue": 0
}
],
"dateTimeFieldSpecs": [
{
"name": "millisSinceEpoch",
"dataType": "LONG",
"format": "EPOCH",
"granularity": "15:MINUTES"
},
{
"name": "hoursSinceEpoch",
"dataType": "INT",
"notNull": true,
"format": "EPOCH|HOURS",
"granularity": "1:HOURS"
},
{
"name": "dateString",
"dataType": "STRING",
"format": "SIMPLE_DATE_FORMAT|yyyy-MM-dd",
"granularity": "1:DAYS"
}
]
}
그런 다음 위의 샘플 스키마를 Bash 명령 또는 REST API 호출로 업로드할 수 있어요.
pinot-admin.sh:
bin/pinot-admin.sh AddSchema -schemaFile flights-schema.json -exec
OR
bin/pinot-admin.sh AddTable -schemaFile flights-schema.json -tableFile flights-table.json -exec
curl:
curl -F [email protected] localhost:9000/schemas
Rest API에서 스키마를 확인해 성공적으로 업로드됐는지 확인하세요.