Ler ficheiros binários

O Azure Databricks suporta a fonte de dados de ficheiros binários, que lê ficheiros binários e converte cada ficheiro num único registo contendo o conteúdo bruto e os metadados do ficheiro. É comumente usado para carregar dados não estruturados, como imagens, áudio ou ficheiros PDF, para processamento a jusante ou inferência de ML. Para ler arquivos binários, especifique a fonte format de dados como binaryFile.

Prerequisites

O Azure Databricks não requer configuração adicional para usar ficheiros binários.

Opções

Use os métodos .option() e .options() de DataFrameReader para configurar a origem de dados do ficheiro binário. Para uma lista completa de opções suportadas, consulte a referência de opções da API Spark.

Esquema de saída

A fonte de dados do ficheiro binário produz um DataFrame com as seguintes colunas, mais quaisquer colunas de partição:

  • path (StringType): O caminho do arquivo.
  • modificationTime (TimestampType): O tempo de modificação do arquivo. Em algumas implementações do Hadoop FileSystem, esse parâmetro pode não estar disponível e o valor seria definido como um valor padrão.
  • length (LongType): O comprimento do arquivo em bytes.
  • content (BinaryType): O conteúdo do arquivo.

Usage

Os exemplos seguintes demonstram o carregamento de ficheiros binários usando a API Spark DataFrame e SQL, filtragem por tipo de ficheiro, visualização de imagens e gravação numa tabela Delta para melhorar o desempenho de leitura.

Ler ficheiros binários

Use a API Apache Spark DataFrame para carregar ficheiros binários num DataFrame para transformação, visualização ou processamento a jusante.

Python

df = spark.read.format("binaryFile").load("/Volumes/<catalog>/<schema>/<volume>/")
display(df)

Scala

val df = spark.read.format("binaryFile").load("/Volumes/<catalog>/<schema>/<volume>/")
df.show()

SQL

SELECT path, length, modificationTime FROM read_files(
  '/Volumes/<catalog>/<schema>/<volume>/images/',
  format => 'binaryFile'
)

Configurar opções de leitura

Para carregar ficheiros com caminhos que correspondam a um determinado padrão de glob, mantendo o comportamento de descoberta de partições, pode usar a opção pathGlobFilter. O código a seguir lê todos os arquivos JPG do diretório de entrada com descoberta de partição:

Python

df = spark.read.format("binaryFile").option("pathGlobFilter", "*.jpg").load("/Volumes/<catalog>/<schema>/<volume>/images/")

Scala

val df = spark.read.format("binaryFile").option("pathGlobFilter", "*.jpg").load("/Volumes/<catalog>/<schema>/<volume>/images/")

SQL

SELECT * FROM read_files(
  '/Volumes/<catalog>/<schema>/<volume>/images/',
  format => 'binaryFile',
  pathGlobFilter => '*.jpg'
)

Se você quiser ignorar a descoberta de partição e pesquisar recursivamente arquivos no diretório de entrada, use a recursiveFileLookup opção. Esta opção pesquisa diretórios aninhados, mesmo que seus nomes não sigam um esquema de nomenclatura de partições como date=2019-07-01. O código a seguir lê todos os arquivos JPG recursivamente do diretório de entrada e ignora a descoberta de partição:

Python

df = (spark.read.format("binaryFile")
  .option("pathGlobFilter", "*.jpg")
  .option("recursiveFileLookup", "true")
  .load("/Volumes/<catalog>/<schema>/<volume>/images/"))

Scala

val df = spark.read.format("binaryFile")
  .option("pathGlobFilter", "*.jpg")
  .option("recursiveFileLookup", "true")
  .load("/Volumes/<catalog>/<schema>/<volume>/images/")

SQL

SELECT * FROM read_files(
  '/Volumes/<catalog>/<schema>/<volume>/images/',
  format => 'binaryFile',
  pathGlobFilter => '*.jpg',
  recursiveFileLookup => true
)

Carregar e exibir imagens

O Databricks recomenda que você use a fonte de dados de arquivo binário para carregar dados de imagem. A função Databricks suporta a exibição de dados de imagem carregados display usando a fonte de dados binária.

Se todos os arquivos carregados tiverem um nome de arquivo com uma extensão de imagem, a visualização da imagem será ativada automaticamente:

Python

df = spark.read.format("binaryFile").load("/Volumes/<catalog>/<schema>/<volume>/images/")
display(df)    # image thumbnails are rendered in the "content" column

Scala

val df = spark.read.format("binaryFile").load("/Volumes/<catalog>/<schema>/<volume>/images/")
df.show()

SQL

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

Pré-visualização da imagem

Como alternativa, pode forçar a funcionalidade de pré-visualização de imagem usando a opção mimeType com um valor de string "image/*" para anotar a coluna binária. As imagens são decodificadas com base em suas informações de formato no conteúdo binário. Os tipos de imagem suportados são bmp, gif, jpege png. Os arquivos não suportados aparecem como um ícone de imagem quebrado.

Python

df = spark.read.format("binaryFile").option("mimeType", "image/*").load("/Volumes/<catalog>/<schema>/<volume>/images/")
display(df)

Scala

val df = spark.read.format("binaryFile").option("mimeType", "image/*").load("/Volumes/<catalog>/<schema>/<volume>/images/")
df.show()

SQL

SELECT * FROM read_files(
  '/Volumes/<catalog>/<schema>/<volume>/images/',
  format => 'binaryFile',
  mimeType => 'image/*'
)

Pré-visualização de imagem com tipo de ficheiro não suportado

Consulte Solução de referência para aplicativos de imagem para o fluxo de trabalho recomendado para lidar com dados de imagem.

Gravar na tabela Delta

Para melhorar o desempenho da leitura quando carregas dados de volta, o Azure Databricks recomenda guardar os dados carregados de ficheiros binários para uma tabela Delta.

Python

df.write.format("delta").saveAsTable("<catalog>.<schema>.<table>")

Scala

df.write.format("delta").saveAsTable("<catalog>.<schema>.<table>")

Recursos adicionais

  • Ler ficheiros de imagem: Se a sua carga de trabalho requer campos estruturados de imagem como altura, largura e dados de canal em vez de bytes brutos, a fonte de dados da imagem fornece um esquema decodificado.