Lesen und Schreiben von ORC-Dateien

Apache ORC ist ein spaltenbasiertes Dateiformat, das für umfangreiche analytische Workloads optimiert ist. Es verwendet integrierte Indizes und Statistiken, um irrelevante Daten während der Lesevorgänge zu überspringen. Azure Databricks unterstützt ORC für das Lesen und Schreiben mit Apache Spark, einschließlich Schemaspezifikation, Partitionierung und Schreibkomprimierung.

Voraussetzungen

Azure Databricks erfordert keine zusätzliche Konfiguration für die Verwendung von ORC-Dateien. Zum Streamen von ORC-Dateien benötigen Sie jedoch das automatische Laden.

Options

Verwenden Sie zum Konfigurieren von ORC-Datenquellen die Methoden .option() und .options() von DataFrameReader und DataFrameWriter. Eine vollständige Liste der unterstützten Optionen finden Sie unter DataFrameReader ORC-Optionen und DataFrameWriter ORC-Optionen.

Usage

In den folgenden Beispielen wird das Wanderbricks-Beispiel-Dataset verwendet, um das Lesen und Schreiben von ORC-Dateien mithilfe der Spark DataFrame-API und SQL zu veranschaulichen.

Lesen und Schreiben von ORC-Dateien

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;

Lesen von ORC-Dateien mit SQL

Verwenden Sie read_files, um ORC-Dateien direkt aus dem Cloudspeicher mithilfe von SQL abzufragen, ohne eine Tabelle zu erstellen.

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

Angeben eines Schemas

Geben Sie beim Lesen von ORC-Dateien ein Schema an, um den Aufwand der Schemazuleitung zu vermeiden. Definieren Sie z. B. ein Schema mit den Feldern review_id, rating und comment und lesen Sie reviews_orc in einen DataFrame ein.

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;

Schreiben von partitionierten ORC-Dateien

Schreiben Sie partitionierte ORC-Dateien für eine optimierte Abfrageleistung für große Datasets. Lesen Sie beispielsweise samples.wanderbricks.bookings und schreiben Sie es nach bookings_orc_partitioned, partitioniert nach year und month, die aus der Spalte check_in abgeleitet werden.

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.{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;

Weitere Ressourcen

  • Was ist Delta Lake in Azure Databricks?: Wenn Sie mit ORC aus einer Hive- oder Hadoop-Umgebung migrieren, ist Delta Lake das empfohlene Databricks-native Format. Es fügt ACID-Transaktionen, Schemadurchsetzung, Zeitreisen und eine optimierte Leseleistung zusätzlich zu Parquet-basiertem Speicher hinzu.
  • Lesen und Schreiben von Parkettdateien: Wenn Ihre Workload die umfassendste Ökosystemkompatibilität außerhalb von Databricks erfordert, ist Parkett das am häufigsten unterstützte Spaltenformat für Abfragemodule und Cloudspeichertools.