ORC 파일 읽기 및 쓰기

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

사전 요구 사항

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

옵션

ORC 데이터 원본의 .option().options()DataFrameReader 및 DataFrameWriter 메서드를 사용하고 구성합니다. 지원되는 옵션의 전체 목록은 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 열에서 파생된 year 및 month를 기준으로 파티셔닝하여 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.{col, month, year}

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은 쿼리 엔진 및 클라우드 스토리지 도구에서 가장 널리 지원되는 열 형식입니다.