첫 테이블과 스키마

첫 테이블과 스키마 (First Table + Schema)

Pinot의 첫 번째 스키마와 테이블을 만들어 데이터 수집을 받을 준비를 하는 페이지예요. 실제 CSV 샘플 데이터를 바탕으로 스키마와 테이블 설정을 작성하고 클러스터에 등록하는 과정을 처음부터 따라 해 볼 수 있어요.

출처: First Table + Schema

본문

이 페이지를 마치면 알게 되는 것 (Outcome)

이 페이지를 끝까지 읽으면 transcript라는 오프라인 테이블과 Pinot 스키마가 클러스터에 등록되어 데이터를 받을 준비가 돼요.

사전 요구 사항 (Prerequisites)

  • 실행 중인 Pinot 클러스터. 로컬 또는 Docker 설치 가이드 참조.
  • Docker 사용자: 클러스터가 pinot-demo 네트워크에 있어야 해요.
  • Pinot 버전 확인. 버전 레퍼런스 페이지를 보고 PINOT_VERSION 환경 변수를 설정하세요:
export PINOT_VERSION=<your-pinot-version>

단계 (Steps)

1. 스키마 이해하기

Pinot 스키마는 테이블의 모든 칼럼을 정의하고 각 칼럼에 칼럼 타입을 부여해요. 칼럼 타입은 세 가지가 있어요:

칼럼 타입 설명
Dimension 데이터를 자르고(slicing) 쪼개는 데(dicing) 필터와 GROUP BY 절에서 사용
Metric 집계에서 사용됨; 정량적 측정값을 나타냄
DateTime 각 행과 연관된 타임스탬프를 나타냄

모든 테이블은 데이터를 받기 전에 스키마가 있어야 해요. 스키마는 Pinot에게 각 필드를 어떻게 해석하고 인덱싱하고 저장할지 알려줘요.

2. 데이터 디렉터리 생성

mkdir -p /tmp/pinot-quick-start/rawdata

3. 샘플 CSV 데이터 저장

/tmp/pinot-quick-start/rawdata/transcript.csv 파일을 다음 내용으로 만드세요:

studentID,firstName,lastName,gender,subject,score,timestampInEpoch
200,Lucy,Smith,Female,Maths,3.8,1570863600000
200,Lucy,Smith,Female,English,3.5,1571036400000
201,Bob,King,Male,Maths,3.2,1571900400000
202,Nick,Young,Male,Physics,3.6,1572418800000

이 데이터셋에서 studentID, firstName, lastName, gender, subject는 dimension, score는 metric, timestampInEpoch는 datetime 칼럼이에요.

4. 스키마 저장

/tmp/pinot-quick-start/transcript-schema.json 파일을 만드세요:

{
  "schemaName": "transcript",
  "dimensionFieldSpecs": [
    { "name": "studentID", "dataType": "INT" },
    { "name": "firstName", "dataType": "STRING" },
    { "name": "lastName", "dataType": "STRING" },
    { "name": "gender", "dataType": "STRING" },
    { "name": "subject", "dataType": "STRING" }
  ],
  "metricFieldSpecs": [
    { "name": "score", "dataType": "FLOAT" }
  ],
  "dateTimeFieldSpecs": [{
    "name": "timestampInEpoch",
    "dataType": "LONG",
    "format": "1:MILLISECONDS:EPOCH",
    "granularity": "1:MILLISECONDS"
  }]
}

5. 테이블 설정 이해하기

테이블 설정(config)은 Pinot에게 런타임에서 테이블을 어떻게 관리할지 알려줘요. 어떤 칼럼을 인덱싱할지, 복제본을 몇 개 유지할지, 어떤 테넌트에 할당할지, 테이블이 OFFLINE(배치)인지 REALTIME(스트리밍)인지 같은 것들이죠. 테이블 설정 하나와 스키마 하나를 짝지어 사용해요.

6. 오프라인 테이블 설정 저장

/tmp/pinot-quick-start/transcript-table-offline.json 파일을 만드세요:

{
  "tableName": "transcript",
  "segmentsConfig": {
    "timeColumnName": "timestampInEpoch",
    "timeType": "MILLISECONDS",
    "replication": "1",
    "schemaName": "transcript"
  },
  "tableIndexConfig": {
    "invertedIndexColumns": [],
    "loadMode": "MMAP"
  },
  "tenants": {
    "broker": "DefaultTenant",
    "server": "DefaultTenant"
  },
  "tableType": "OFFLINE",
  "metadata": {}
}

7. 스키마와 테이블 설정 업로드

로컬:

bin/pinot-admin.sh AddTable \
  -tableConfigFile /tmp/pinot-quick-start/transcript-table-offline.json \
  -schemaFile /tmp/pinot-quick-start/transcript-schema.json \
  -exec

Docker:

docker run --rm -ti \
    --network=pinot-demo \
    -v /tmp/pinot-quick-start:/tmp/pinot-quick-start \
    --name pinot-table-creation \
    apachepinot/pinot:${PINOT_VERSION} AddTable \
    -schemaFile /tmp/pinot-quick-start/transcript-schema.json \
    -tableConfigFile /tmp/pinot-quick-start/transcript-table-offline.json \
    -controllerHost pinot-controller \
    -controllerPort 9000 \
    -exec

💡 설정 중 다른 이름을 사용했다면 pinot-controller를 실제 Pinot controller 컨테이너 이름으로 바꾸세요.

확인 (Verify)

  1. http://localhost:9000에서 Pinot Data Explorer를 엽니다.
  2. Tables 탭으로 이동합니다.
  3. transcript_OFFLINE이 나열된 것을 확인합니다.

테이블이 나타나면 스키마와 테이블 설정이 성공적으로 등록된 거예요.

다음 단계 (Next step)

이제 빈 테이블이 생겼어요. CSV 데이터를 transcript 테이블로 가져오려면 첫 배치 수집으로 계속 진행하세요.

더 알아보기 (Learn more)