讀取與寫入 ORC 檔案

Apache ORC 是一種為大規模分析工作負載優化的欄位檔案格式。 它利用內建索引和統計資料,在讀取時跳過無關資料。 Azure Databricks 支援 ORC 用於 Apache Spark 的讀寫,包括結構規範、分割及寫入壓縮。

先決條件

Azure Databricks 使用 ORC 檔案不需要額外設定。 不過,要串流 ORC 檔案,你需要 Auto Loader

選項

使用 .option().options()DataFrameReaderDataFrameWriter 方法來配置 ORC 資料來源。 欲了解完整的支援選項清單,請參閱 DataFrameReader ORC optionsDataFrameWriter ORC options

Usage

以下範例使用 Wanderbricks 範例資料集示範使用 Spark DataFrame API 與 SQL 讀寫 ORC 檔案。

讀取與寫入 ORC 檔案

Python

# 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 檔案

read_files SQL 直接從雲端儲存查詢 ORC 檔案,不用建立資料表。

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

指定一個結構

讀取 ORC 檔案時指定結構,以避免結構推論的額外負擔。 例如,定義一個結構,其中 review_idratingcomment 欄位,並讀取 reviews_orc 到資料框架中。

Python

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,並將其寫入 bookings_orc_partitioned,依據從 check_in 欄位衍生出的 yearmonth 進行分割。

Python

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 原生格式。 它在以 Parquet 為基礎的儲存之上,新增了 ACID 交易支援、綱要強制、時間回溯,以及最佳化讀取效能。
  • 讀寫 Parquet 檔案:如果您的工作負載需要 Databricks 以外最廣泛的生態系統相容性,Parquet 是查詢引擎與雲端儲存工具中最廣泛支援的欄位格式。