Spark Pinot 커넥터 쓰기 모델

Spark Pinot 커넥터 쓰기 모델 (Write Model)

주의: 이 기능은 실험적이며 API가 향후 릴리스에서 변경될 수 있어요.

Spark 커넥터는 Spark DataFrames에서 Pinot 세그먼트를 쓰는 실험적 지원도 있어요. 현재 구현은 .save(path)(path 옵션과 동등)로 제공된 대상 경로에 OFFLINE 세그먼트 tar 파일을 쓰며, DataFrame의 스키마는 Pinot 테이블의 스키마와 일치해야 해요. 아래 예시는 append 모드를 사용해요.

출처: 문서

본문

// 샘플 데이터 생성
val data = Seq(
  ("ORD", "Florida", 1000, true, 1722025994),
  ("ORD", "Florida", 1000, false, 1722025994),
  ("ORD", "Florida", 1000, false, 1722025994),
  ("NYC", "New York", 20, true, 1722025994),
)

val airports = spark.createDataFrame(data)
  .toDF("airport", "state", "distance", "active", "ts")
  .repartition(2)

airports.write.format("pinot")
  .mode("append")
  .option("table", "airlineStats")
  .option("segmentNameFormat", "{table}_{startTime}_{endTime}_{partitionId:03}")
  .option("invertedIndexColumns", "airport")
  .option("noDictionaryColumns", "airport,state")
  .option("bloomFilterColumns", "airport")
  .option("rangeIndexColumns", "distance")
  .option("timeColumnName", "ts")
  .option("timeFormat", "EPOCH|SECONDS")
  .option("timeGranularity", "1:SECONDS")
  .save("myPath")

.save("myPath")는 필요한 path 옵션을 자동으로 제공해요. writer는 아래 옵션을 읽어 대상 파일시스템에 tar.gz 세그먼트 파일을 푸시하기 전에 Pinot 세그먼트 메타데이터와 인덱스를 구축하는 데 사용해요.

커넥터 쓰기 파라미터

Configuration Description Required Default Value
table 생성된 세그먼트 메타데이터 및 스키마 변환에 사용되는 Pinot 테이블 이름. Yes -
path 생성된 세그먼트 tar 파일의 대상 디렉토리. .save("...") 호출이 이 옵션을 자동으로 설정. 현재 구현은 로컬 파일시스템과 HDFS로 푸시. Yes -
segmentNameFormat 세그먼트 이름 템플릿. {table}, {partitionId}, {startTime}, {endTime} 자리 표시자와 {partitionId:03} 같은 0-패딩을 지원. startTime과 endTime은 숫자 timeColumnName의 최소/최대 값으로 채워짐. No <tableName>-{partitionId:03}
invertedIndexColumns 생성된 세그먼트에서 Pinot inverted index를 사용해야 하는 컬럼의 쉼표 구분 목록. No Empty
noDictionaryColumns 생성된 세그먼트에서 dictionary 인코딩을 비활성화해야 하는 컬럼의 쉼표 구분 목록. No Empty
bloomFilterColumns 생성된 세그먼트에서 Pinot bloom filter를 사용해야 하는 컬럼의 쉼표 구분 목록. No Empty
rangeIndexColumns 생성된 세그먼트에서 Pinot range index를 사용해야 하는 컬럼의 쉼표 구분 목록. No Empty
timeColumnName 생성된 스키마와 세그먼트 메타데이터에 방출할 Pinot time 컬럼 이름. 설정 시 timeFormat과 timeGranularity도 반드시 설정해야 함. No None
timeFormat timeColumnName용 Pinot date-time 형식(예: `EPOCH SECONDS`). Conditionally required
timeGranularity timeColumnName용 Pinot granularity(예: 1:SECONDS). Conditionally required None

검증 및 동작 참고 사항

  • table과 path는 필수. writer는 둘 중 하나라도 생략된 요청을 거부해요.
  • segmentNameFormat은 빈 문자열일 수 없어요.
  • timeColumnName이 설정되면 timeFormat과 timeGranularity도 반드시 설정되어야 해요.
  • tableType은 현재 쓰기 옵션 계약의 일부가 아니에요. writer는 Spark에 전달된 tableType 옵션과 관계없이 OFFLINE 세그먼트를 구축해요.

자세한 내용은 org.apache.pinot.connector.spark.v3.datasource.PinotDataWriter와 org.apache.pinot.connector.spark.common.PinotDataSourceWriteOptions의 구현을 참조하세요.

더 알아보기 (Learn more)