Leer y escribir archivos ORC

Apache ORC es un formato de archivo en columnas optimizado para cargas de trabajo analíticas a gran escala. Usa índices y estadísticas integrados para omitir los datos irrelevantes durante las lecturas. Azure Databricks admite ORC para leer y escribir con Apache Spark, incluida la especificación de esquema, la creación de particiones y la compresión de escritura.

Prerrequisitos

Azure Databricks no requiere configuración adicional para usar archivos ORC. Sin embargo, para transmitir archivos ORC, necesita cargador automático.

Options

Utilice los métodos .option() y .options() de DataFrameReader y DataFrameWriter para configurar orígenes de datos ORC. Para obtener una lista completa de las opciones admitidas, consulte DataFrameReader Opciones orc y DataFrameWriter opciones orc.

Usage

En los ejemplos siguientes se usa el conjunto de datos de ejemplo de Wanderbricks para demostrar la lectura y escritura de archivos ORC mediante spark DataFrame API y SQL.

Leer y escribir archivos 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;

Leer archivos ORC mediante SQL

Use read_files para consultar archivos ORC directamente desde el almacenamiento en la nube mediante SQL sin crear una tabla.

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

Especificar un esquema

Especifique un esquema al leer archivos ORC para evitar la sobrecarga de la inferencia de esquema. Por ejemplo, defina un esquema con los campos review_id, rating y comment, y lea reviews_orc en 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;

Escribir archivos ORC particionados

Escriba archivos ORC con particiones para optimizar el rendimiento de las consultas en grandes conjuntos de datos. Por ejemplo, lea samples.wanderbricks.bookings y escríbalo en bookings_orc_partitioned con particiones según year y month, derivados de la columna 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;

Recursos adicionales

  • ¿Qué es Delta Lake en Azure Databricks?: si va a migrar desde un entorno de Hive o Hadoop mediante ORC, Delta Lake es el formato nativo de Databricks recomendado. Agrega transacciones ACID, aplicación de esquemas, viajes en tiempo y rendimiento de lectura optimizado sobre el almacenamiento basado en Parquet.
  • Leer y escribir archivos Parquet: si la carga de trabajo requiere la compatibilidad más amplia del ecosistema fuera de Databricks, Parquet es el formato de columnas más compatible entre motores de consultas y herramientas de almacenamiento en la nube.