Lire et écrire des fichiers ORC

Apache ORC est un format de fichier en colonnes optimisé pour les charges de travail analytiques à grande échelle. Il utilise des index et des statistiques intégrés pour ignorer les données non pertinentes pendant les lectures. Azure Databricks prend en charge ORC pour la lecture et l’écriture avec Apache Spark, notamment la spécification du schéma, le partitionnement et la compression d’écriture.

Prerequisites

Azure Databricks ne nécessite pas de configuration supplémentaire pour utiliser des fichiers ORC. Toutefois, pour diffuser en continu des fichiers ORC, vous avez besoin d’un chargeur automatique.

Options

Utilisez les méthodes .option() et .options() de DataFrameReader et DataFrameWriter pour configurer des sources de données ORC. Pour obtenir la liste complète des options prises en charge, consultez DataFrameReader les options ORC et DataFrameWriter les options ORC.

Usage

Les exemples suivants utilisent l’exemple de jeu de données Wanderbricks pour illustrer la lecture et l’écriture de fichiers ORC à l’aide de l’API DataFrame Spark et de SQL.

Lire et écrire des fichiers 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;

Lire des fichiers ORC à l’aide de SQL

Permet read_files d’interroger des fichiers ORC directement à partir du stockage cloud à l’aide de SQL sans créer de table.

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

Spécifier un schéma

Spécifiez un schéma lors de la lecture des fichiers ORC pour éviter la surcharge de l’inférence de schéma. Par exemple, définissez un schéma avec les champs review_id, rating et comment, puis lisez reviews_orc dans un 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;

Écrire des fichiers ORC partitionnés

Écrivez des fichiers ORC partitionnés pour optimiser les performances des requêtes sur des jeux de données volumineux. Par exemple, lisez samples.wanderbricks.bookings et écrivez-le vers bookings_orc_partitioned, partitionné par year et month, dérivés de la colonne 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.{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;

Ressources additionnelles

  • Qu’est-ce que Delta Lake dans Azure Databricks ? : si vous migrez à partir d’un environnement Hive ou Hadoop à l’aide d’ORC, Delta Lake est le format databricks-natif recommandé. Il ajoute les transactions ACID, l’application de schéma, le voyage dans le temps et des performances de lecture optimisées sur un stockage basé sur Parquet.
  • Lire et écrire des fichiers Parquet : si votre charge de travail nécessite la plus grande compatibilité de l’écosystème en dehors de Databricks, Parquet est le format columnar le plus largement pris en charge dans les moteurs de requête et les outils de stockage cloud.