Pular para o conteúdo principal

Ler e gravar arquivos Avro

Apache Avro é um formato de serialização de dados baseado em linhas que fornece estruturas de dados ricas e uma codificação binária compacta e rápida. Os usuários do Databricks o encontram mais comumente ao ingerir dados de sistemas de transmissão de eventos, como Apache Kafka e Google Pub/Sub, onde Avro é o formato de serialização dominante. Databricks oferece suporte a Avro para leitura e gravação com o Apache Spark, incluindo conversão automática de esquema entre tipos Avro e Spark SQL, particionamento, compactação e nomes de registro personalizados.

Se você estiver lendo registros codificados em Avro do Apache Kafka ou de outro barramento de mensagens em vez de arquivos, consulte Ler e gravar dados de transmissão Avro, que aborda as funções from_avro e to_avro usadas para desserialização de transmissão.

Pré-requisitos

Databricks não exige configuração adicional para usar arquivos Avro. No entanto, para transmitir arquivos Avro, você precisa de Auto Loader.

Opções

Use os métodos .option() e .options() de DataFrameReader e DataFrameWriter para configurar fontes de dados Avro. Para obter uma lista completa de opções compatíveis, consulte DataFrameReader opções do Avro e DataFrameWriter opções do Avro.

Uso

Os exemplos a seguir usam o dataset Wanderbricks para demonstrar a leitura e a gravação de arquivos Avro usando a API Spark DataFrame e SQL.

Ler arquivos Avro usando SQL

Para consultar arquivos Avro sem registrar uma tabela, use read_files. As permissões do Unity Catalog no local externo aplicam-se automaticamente.

SQL
SELECT * FROM read_files(
'/Volumes/<catalog>/<schema>/<volume>/reviews_avro',
format => 'avro'
)

Ler e gravar arquivos Avro

Use a API Apache Spark DataFrame quando precisar ler ou gravar arquivos Avro para um sistema downstream, aplicar transformações antes de carregar ou controlar opções como particionamento e esquema no momento da gravação.

Os exemplos a seguir usam o Wanderbricks dataset de amostra.

Python
from pyspark.sql.functions import year, month

# Write wanderbricks reviews to Avro format
df = spark.read.table("samples.wanderbricks.reviews")
df.write.format("avro").save("/Volumes/<catalog>/<schema>/<volume>/reviews_avro")

# Read an Avro file into a DataFrame
df = spark.read.format("avro").load("/Volumes/<catalog>/<schema>/<volume>/reviews_avro")
display(df)

# Write with overwrite mode
df.write.format("avro").mode("overwrite").save("/Volumes/<catalog>/<schema>/<volume>/reviews_avro")

# Read using a custom Avro schema to select specific fields
avro_schema = """
{
"type": "record",
"name": "Review",
"fields": [
{"name": "review_id", "type": "string"},
{"name": "rating", "type": "int"},
{"name": "comment", "type": ["null", "string"]}
]
}
"""
df = spark.read.format("avro").option("avroSchema", avro_schema).load("/Volumes/<catalog>/<schema>/<volume>/reviews_avro")

# Write partitioned Avro files by year and 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("avro").partitionBy("year", "month").save("/Volumes/<catalog>/<schema>/<volume>/bookings_avro_partitioned")

# Write with a custom record name and namespace for Schema Registry compatibility
df = spark.read.table("samples.wanderbricks.reviews")
df.write.format("avro").options(
recordName="Review",
recordNamespace="com.wanderbricks"
).save("/Volumes/<catalog>/<schema>/<volume>/reviews_avro")

Recursos adicionais

  • Ler e gravar arquivos Parquet: Se sua carga de trabalho for principalmente analítica e com predominância de leitura, em vez de transmissão ou com predominância de gravação, a disposição em coluna do Parquet oferece um desempenho de consulta mais eficiente do que o armazenamento orientado a linhas do Avro.