Apache ORC 是一種為大規模分析工作負載優化的欄位檔案格式。 它利用內建索引和統計資料,在讀取時跳過無關資料。 Azure Databricks 支援 ORC 用於 Apache Spark 的讀寫,包括結構規範、分割及寫入壓縮。
先決條件
Azure Databricks 使用 ORC 檔案不需要額外設定。 不過,要串流 ORC 檔案,你需要 Auto Loader。
選項
使用 .option() 和 .options() 的 DataFrameReader 和 DataFrameWriter 方法來配置 ORC 資料來源。 欲了解完整的支援選項清單,請參閱 DataFrameReader ORC options 及 DataFrameWriter 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_id、 rating、 comment 欄位,並讀取 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 欄位衍生出的 year 和 month 進行分割。
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 是查詢引擎與雲端儲存工具中最廣泛支援的欄位格式。