Membaca dan menulis file ORC

Apache ORC adalah format file kolom yang dioptimalkan untuk beban kerja analitik skala besar. Ini menggunakan indeks dan statistik bawaan untuk melewati data yang tidak relevan selama pembacaan. Azure Databricks mendukung ORC untuk membaca dan menulis dengan Apache Spark, termasuk spesifikasi skema, partisi, dan kompresi tulis.

Prasyarat

Azure Databricks tidak memerlukan konfigurasi tambahan untuk menggunakan file ORC. Namun, untuk melakukan streaming file ORC, Anda memerlukan Auto Loader.

Opsi

Gunakan metode .option() dan .options() milik DataFrameReader dan DataFrameWriter untuk mengonfigurasi sumber data ORC. Untuk daftar lengkap opsi yang didukung, lihat DataFrameReader Opsi ORC dan DataFrameWriter opsi ORC.

Usage

Contoh berikut menggunakan himpunan data sampel Wanderbricks untuk menunjukkan pembacaan dan penulisan file ORC menggunakan Spark DataFrame API dan SQL.

Membaca dan menulis file 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;

Membaca file ORC menggunakan SQL

Gunakan read_files untuk mengkueri file ORC langsung dari penyimpanan cloud menggunakan SQL tanpa membuat tabel.

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

Tentukan skema

Tentukan skema saat membaca file ORC untuk menghindari overhead inferensi skema. Misalnya, tentukan skema dengan kolom review_id, rating, dan comment, lalu baca reviews_orc ke DataFrame.

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;

Menulis file ORC yang dipartisi

Tulis file ORC yang dipartisi untuk performa kueri yang dioptimalkan pada himpunan data besar. Misalnya, baca samples.wanderbricks.bookings dan tulis ke bookings_orc_partitioned yang dipartisi berdasarkan year dan month yang diturunkan dari kolom check_in.

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;

Sumber daya tambahan

  • Apa itu Delta Lake dalam Azure Databricks?: Jika Anda bermigrasi dari lingkungan Apache Hive atau Hadoop menggunakan ORC, Delta Lake adalah format asli Databricks yang direkomendasikan. Ini menambahkan transaksi ACID, penegakan skema, perjalanan waktu, dan performa baca yang dioptimalkan di atas penyimpanan berbasis Parquet.
  • Membaca dan menulis file Parquet: Jika beban kerja Anda memerlukan kompatibilitas ekosistem terluas di luar Databricks, Parquet adalah format kolom yang paling banyak didukung di seluruh mesin kueri dan alat penyimpanan cloud.