Partager via


Utiliser des fichiers ORC

Apache ORC est un format de fichier en colonnes qui fournit des optimisations pour accélérer les requêtes. Il est plus efficace que CSV ou JSON. Azure Databricks prend en charge ORC pour la lecture et l’écriture avec Apache Spark. Pour plus d’informations, consultez la documentation Apache Spark sur les fichiers ORC.

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.

Configurer et utiliser ORC avec l’API DataFrame

Utilisez l’API DataFrame Apache Spark pour lire et écrire des fichiers ORC lorsque vous avez besoin d’un contrôle total sur le schéma, le partitionnement ou le comportement d’écriture.

Options de lecture et d’écriture

Consultez les articles de référence Apache Spark suivants pour les options de lecture et d’écriture de l’API DataFrame prises en charge.

Lire et écrire des fichiers ORC

Par exemple, lisez les données de data.orc dans un DataFrame df et écrivez-les dans orc_output.

Python

# Read an ORC file into a DataFrame
df = spark.read.format("orc").load("/tmp/data.orc")
df.show()

# Write a DataFrame to ORC format
df.write.format("orc").save("/tmp/orc_output")

# Write with overwrite mode
df.write.format("orc").mode("overwrite").save("/tmp/orc_output")

Scala

// Read an ORC file into a DataFrame
val df = spark.read.format("orc").load("/tmp/data.orc")
df.show()

// Write a DataFrame to ORC format
df.write.format("orc").save("/tmp/orc_output")

// Write with overwrite mode
df.write.format("orc").mode("overwrite").save("/tmp/orc_output")

SQL

-- Query ORC files directly
SELECT * FROM orc.`/tmp/data.orc`;

-- Create a table from ORC files
CREATE TABLE orc_table
USING ORC
OPTIONS (path "/tmp/data.orc");

SELECT * FROM orc_table;

Lire des fichiers ORC avec une spécification de 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 name, age et city, puis lisez data.orc dans un DataFrame df.

Python

from pyspark.sql.types import StructType, StructField, StringType, IntegerType

schema = StructType([
    StructField("name", StringType(), True),
    StructField("age", IntegerType(), True),
    StructField("city", StringType(), True)
])

df = spark.read.format("orc").schema(schema).load("/tmp/data.orc")
df.printSchema()
df.show()

Scala

import org.apache.spark.sql.types.{StructType, StructField, StringType, IntegerType}

val schema = StructType(Array(
  StructField("name", StringType, nullable = true),
  StructField("age", IntegerType, nullable = true),
  StructField("city", StringType, nullable = true)
))

val df = spark.read.format("orc").schema(schema).load("/tmp/data.orc")
df.printSchema()
df.show()

SQL

-- Create a table with an explicit schema from ORC files
CREATE TABLE orc_table (
  name STRING,
  age INT,
  city STRING
)
USING ORC
OPTIONS (path "/tmp/data.orc");

SELECT * FROM orc_table;

É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, créez un DataFrame avec les colonnes df, year, month, et name, et écrivez-le dans amount, partitionné par partitioned_orc et year.

Python

df = spark.createDataFrame(
    [
        (2023, 1, "Alice", 100),
        (2023, 1, "Bob", 200),
        (2023, 2, "Alice", 150),
        (2024, 1, "Alice", 300),
    ],
    ["year", "month", "name", "amount"]
)

# Write partitioned by year and month
df.write.format("orc").partitionBy("year", "month").save("/tmp/partitioned_orc")

Scala

val df = Seq(
  (2023, 1, "Alice", 100),
  (2023, 1, "Bob", 200),
  (2023, 2, "Alice", 150),
  (2024, 1, "Alice", 300)
).toDF("year", "month", "name", "amount")

// Write partitioned by year and month
df.write.format("orc").partitionBy("year", "month").save("/tmp/partitioned_orc")

SQL

-- Create a partitioned ORC table
CREATE TABLE partitioned_orc_table (
  name STRING,
  amount INT
)
USING ORC
PARTITIONED BY (year INT, month INT);

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. Par exemple, interrogez un fichier ORC stocké dans le stockage cloud à l’aide du chemin d’accès au fichier et du spécificateur de orc format.

SELECT * FROM read_files(
  's3://<bucket>/<path>/<file>.orc',
  format => 'orc'
)

Définir la compression ORC

Configurez la compression ORC à l’aide de l’option compression . Les codecs pris en charge incluent none, snappy, zlibet lzo. Par exemple, écrivez df à compressed_orc en utilisant la compression zlib, ou à snappy_orc en utilisant la compression snappy.

Python

# Write with zlib compression
df.write.format("orc").option("compression", "zlib").save("/tmp/compressed_orc")

# Write with snappy compression (default)
df.write.format("orc").option("compression", "snappy").save("/tmp/snappy_orc")

Scala

// Write with zlib compression
df.write.format("orc").option("compression", "zlib").save("/tmp/compressed_orc")

// Write with snappy compression (default)
df.write.format("orc").option("compression", "snappy").save("/tmp/snappy_orc")

SQL

-- Create an ORC table with zlib compression
CREATE TABLE compressed_orc_table (
  name STRING,
  age INT,
  city STRING
)
USING ORC
TBLPROPERTIES ('orc.compress' = 'ZLIB');

-- Create an ORC table with snappy compression
CREATE TABLE snappy_orc_table (
  name STRING,
  age INT,
  city STRING
)
USING ORC
TBLPROPERTIES ('orc.compress' = 'SNAPPY');