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