Ler e gravar arquivos ORC

O Apache ORC é um formato de arquivo columnar otimizado para cargas de trabalho analíticas em larga escala. Ele usa índices internos e estatísticas para ignorar dados irrelevantes durante as leituras. Azure Databricks dá suporte a ORC para leitura e gravação com o Apache Spark, incluindo especificação de esquema, particionamento e compactação de gravação.

Pré-requisitos

O Azure Databricks não requer configuração adicional para usar arquivos ORC. No entanto, para transmitir arquivos ORC, você precisa do Carregador Automático.

Opções

Use os métodos .option() e .options() de DataFrameReader e DataFrameWriter para configurar fontes de dados ORC. Para obter uma lista completa de opções com suporte, consulte DataFrameReader opções ORC e DataFrameWriter opções ORC.

Usage

Os exemplos a seguir usam o conjunto de dados de exemplo do Wanderbricks para demonstrar a leitura e gravação de arquivos ORC usando a API e o SQL do DataFrame do Spark.

Ler e gravar arquivos 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;

Ler arquivos ORC usando SQL

Use read_files para consultar arquivos ORC diretamente do armazenamento em nuvem usando SQL sem criar uma tabela.

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

Especificar um esquema

Especifique um esquema ao ler arquivos ORC para evitar a sobrecarga de inferência de esquema. Por exemplo, defina um esquema com os campos review_id, rating e comment e leia reviews_orc em um 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;

Gravar arquivos ORC particionados

Escreva arquivos ORC particionados para desempenho de consulta otimizado em grandes conjuntos de dados. Por exemplo, leia samples.wanderbricks.bookings e grave-o em bookings_orc_partitioned, particionado por year e month, derivados da coluna 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 adicionais

  • O que é o Delta Lake em Azure Databricks?: se você estiver migrando de um ambiente hive ou Hadoop usando ORC, Delta Lake será o formato nativo recomendado do Databricks. Ele adiciona transações ACID, imposição de esquema, viagem no tempo e desempenho de leitura otimizado além do armazenamento baseado em Parquet.
  • Ler e gravar arquivos Parquet: se sua carga de trabalho exigir a compatibilidade mais ampla do ecossistema fora do Databricks, Parquet será o formato columnar mais amplamente suportado entre mecanismos de consulta e ferramentas de armazenamento em nuvem.