ORC 파일 읽기 및 쓰기

Apache ORC 는 대규모 분석 워크로드에 최적화된 열 형식 파일 형식입니다. 읽기 중에는 기본 제공 인덱스 및 통계를 사용하여 관련 없는 데이터를 건너뜁니다. Azure Databricks 스키마 사양, 분할 및 쓰기 압축을 포함하여 Apache Spark를 사용한 읽기 및 쓰기 모두에 ORC를 지원합니다.

사전 요구 사항

Azure Databricks는 ORC 파일을 사용하기 위해 추가 구성이 필요하지 않습니다. 그러나 ORC 파일을 스트리밍하려면 자동 로더가 필요합니다.

옵션

ORC 데이터 원본의 .option().options()DataFrameReaderDataFrameWriter 메서드를 사용하고 구성합니다. 지원되는 옵션의 전체 목록은 ORC 옵션 및 ORC 옵션을 참조DataFrameReader하세요.DataFrameWriter

Usage

다음 예제에서는 Wanderbricks 샘플 데이터 세트를 사용하여 Spark DataFrame API 및 SQL을 사용하여 ORC 파일을 읽고 쓰는 방법을 보여 줍니다.

ORC 파일 읽기 및 쓰기

파이썬

# Write wanderbricks reviews to ORC format
df = spark.read.table("samples.wanderbricks.reviews")
df.write.format("orc").save("/Volumes/<catalog>/<schema>/<volume>/reviews_orc")

# Read an ORC file into a DataFrame
df = spark.read.format("orc").load("/Volumes/<catalog>/<schema>/<volume>/reviews_orc")
display(df)

# Write with overwrite mode
df.write.format("orc").mode("overwrite").save("/Volumes/<catalog>/<schema>/<volume>/reviews_orc")

Scala

// Write wanderbricks reviews to ORC format
val reviews = spark.read.table("samples.wanderbricks.reviews")
reviews.write.format("orc").save("/Volumes/<catalog>/<schema>/<volume>/reviews_orc")

// Read an ORC file into a DataFrame
val df = spark.read.format("orc").load("/Volumes/<catalog>/<schema>/<volume>/reviews_orc")
df.show()

// Write with overwrite mode
df.write.format("orc").mode("overwrite").save("/Volumes/<catalog>/<schema>/<volume>/reviews_orc")

SQL

-- Write wanderbricks reviews to ORC format
CREATE TABLE reviews_orc
USING ORC
AS SELECT * FROM samples.wanderbricks.reviews;

SELECT * FROM reviews_orc;

SQL을 사용하여 ORC 파일 읽기

테이블을 만들지 않고 SQL을 사용하여 클라우드 스토리지에서 직접 ORC 파일을 쿼리하는 데 사용합니다 read_files .

SELECT * FROM read_files(
  '/Volumes/<catalog>/<schema>/<volume>/reviews_orc',
  format => 'orc'
)

스키마 지정

스키마 유추의 오버헤드를 방지하기 위해 ORC 파일을 읽을 때 스키마를 지정합니다. 예를 들어, review_id, rating, 및 comment 필드가 있는 스키마를 정의하고 reviews_orc를 DataFrame으로 읽습니다.

파이썬

from pyspark.sql.types import StructType, StructField, StringType, IntegerType

schema = StructType([
    StructField("review_id", StringType(), True),
    StructField("rating", IntegerType(), True),
    StructField("comment", StringType(), True)
])

df = spark.read.format("orc").schema(schema).load("/Volumes/<catalog>/<schema>/<volume>/reviews_orc")
df.printSchema()
df.show()

Scala

import org.apache.spark.sql.types.{StructType, StructField, StringType, IntegerType}

val schema = StructType(Array(
  StructField("review_id", StringType, nullable = true),
  StructField("rating", IntegerType, nullable = true),
  StructField("comment", StringType, nullable = true)
))

val df = spark.read.format("orc").schema(schema).load("/Volumes/<catalog>/<schema>/<volume>/reviews_orc")
df.printSchema()
df.show()

SQL

-- Create a table with an explicit schema from ORC files
CREATE TABLE reviews_orc (
  review_id STRING,
  rating INT,
  comment STRING
)
USING ORC
OPTIONS (path "/Volumes/<catalog>/<schema>/<volume>/reviews_orc");

SELECT * FROM reviews_orc;

분할된 ORC 파일 작성

큰 데이터 세트에 최적화된 쿼리 성능을 위해 분할된 ORC 파일을 작성합니다. 예를 들어 samples.wanderbricks.bookings를 읽고 check_in 열에서 파생된 yearmonth를 기준으로 파티셔닝하여 bookings_orc_partitioned에 씁니다.

파이썬

from pyspark.sql.functions import year, month

df = spark.read.table("samples.wanderbricks.bookings")
df_with_parts = df.withColumn("year", year("check_in")).withColumn("month", month("check_in"))
df_with_parts.write.format("orc").partitionBy("year", "month").save("/Volumes/<catalog>/<schema>/<volume>/bookings_orc_partitioned")

Scala

import org.apache.spark.sql.functions.{year, month}

val bookings = spark.read.table("samples.wanderbricks.bookings")
val bookingsWithParts = bookings.withColumn("year", year(col("check_in"))).withColumn("month", month(col("check_in")))
bookingsWithParts.write.format("orc").partitionBy("year", "month").save("/Volumes/<catalog>/<schema>/<volume>/bookings_orc_partitioned")

SQL

-- Write partitioned ORC files by year and month
CREATE TABLE bookings_orc_partitioned
USING ORC
PARTITIONED BY (year, month)
AS SELECT *, year(check_in) AS year, month(check_in) AS month
FROM samples.wanderbricks.bookings;

추가 리소스

  • Azure Databricks Delta Lake란?: ORC를 사용하여 Hive 또는 Hadoop 환경에서 마이그레이션하는 경우 Delta Lake가 권장되는 Databricks 네이티브 형식입니다. Parquet 기반 스토리지를 기반으로 ACID 트랜잭션, 스키마 적용, 시간 이동 및 최적화된 읽기 성능을 추가합니다.
  • Parquet 파일 읽기 및 쓰기: 워크로드에 Databricks 외부에서 가장 광범위한 에코시스템 호환성이 필요한 경우 Parquet은 쿼리 엔진 및 클라우드 스토리지 도구에서 가장 널리 지원되는 열 형식입니다.