Ler arquivos binários
Databricks oferece suporte à fonte de dados de arquivo binário, que lê arquivos binários e converte cada arquivo em um único registro contendo o conteúdo bruto e os metadados do arquivo. É comumente usado para carregar dados não estruturados, como imagens, áudios ou arquivos PDF, para processamento subsequente ou inferência de ML. Para ler arquivos binários, especifique a fonte de dados format como binaryFile.
Pré-requisitos
Databricks não exige configuração adicional para usar arquivos binários.
Opções
Use os métodos .option() e .options() de DataFrameReader para configurar a fonte de dados de arquivo binário. Para obter uma lista completa das opções com suporte, consulte a referência de opções da Spark API.
Esquema de saída
A fonte de dados de arquivo binário produz um DataFrame com as seguintes colunas, além de quaisquer colunas de partição:
path (StringType): O caminho do arquivo.modificationTime (TimestampType): A hora da modificação do arquivo. Em algumas implementações do Hadoop FileSystem, este parâmetro pode estar indisponível e o valor seria definido como um valor default.length (LongType): o tamanho do arquivo em bytes.content (BinaryType): O conteúdo do arquivo.
Uso
Os exemplos a seguir demonstram o carregamento de arquivos binários usando a API do Spark DataFrame e SQL, filtrando por tipo de arquivo, exibindo visualizações de imagem e salvando em uma tabela Delta para melhor desempenho de leitura.
Ler arquivos binários
Use a API do Apache Spark DataFrame para carregar arquivos binários em um DataFrame para transformações, exibição ou processamento posterior.
- Python
- Scala
- SQL
df = spark.read.format("binaryFile").load("/Volumes/<catalog>/<schema>/<volume>/")
display(df)
val df = spark.read.format("binaryFile").load("/Volumes/<catalog>/<schema>/<volume>/")
df.show()
SELECT path, length, modificationTime FROM read_files(
'/Volumes/<catalog>/<schema>/<volume>/images/',
format => 'binaryFile'
)
Configure opções de leitura
Para carregar arquivos com caminhos que correspondam a um determinado padrão global e, ao mesmo tempo, manter o comportamento da descoberta de partições,
você 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
- Scala
- SQL
df = spark.read.format("binaryFile").option("pathGlobFilter", "*.jpg").load("/Volumes/<catalog>/<schema>/<volume>/images/")
val df = spark.read.format("binaryFile").option("pathGlobFilter", "*.jpg").load("/Volumes/<catalog>/<schema>/<volume>/images/")
SELECT * FROM read_files(
'/Volumes/<catalog>/<schema>/<volume>/images/',
format => 'binaryFile',
pathGlobFilter => '*.jpg'
)
Se você quiser ignorar a descoberta de partições e pesquisar recursivamente arquivos no diretório de entrada,
use a opção recursiveFileLookup. Essa opção pesquisa em 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ções:
- Python
- Scala
- SQL
df = (spark.read.format("binaryFile")
.option("pathGlobFilter", "*.jpg")
.option("recursiveFileLookup", "true")
.load("/Volumes/<catalog>/<schema>/<volume>/images/"))
val df = spark.read.format("binaryFile")
.option("pathGlobFilter", "*.jpg")
.option("recursiveFileLookup", "true")
.load("/Volumes/<catalog>/<schema>/<volume>/images/")
SELECT * FROM read_files(
'/Volumes/<catalog>/<schema>/<volume>/images/',
format => 'binaryFile',
pathGlobFilter => '*.jpg',
recursiveFileLookup => true
)
Carregar e exibir imagens
Databricks recomenda o uso da fonte de dados de arquivo binário para carregar dados de imagem. A função Databricks display suporta a exibição de dados de imagem carregados 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
- Scala
- SQL
df = spark.read.format("binaryFile").load("/Volumes/<catalog>/<schema>/<volume>/images/")
display(df) # image thumbnails are rendered in the "content" column
val df = spark.read.format("binaryFile").load("/Volumes/<catalog>/<schema>/<volume>/images/")
df.show()
SELECT * FROM read_files(
'/Volumes/<catalog>/<schema>/<volume>/images/',
format => 'binaryFile'
)

Como alternativa, o senhor pode forçar a funcionalidade de visualização da imagem usando a opção mimeType com um valor de cadeia de caracteres "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 compatíveis são bmp, gif, jpeg e png. Os arquivos não suportados aparecem como um ícone de imagem quebrado.
- Python
- Scala
- SQL
df = spark.read.format("binaryFile").option("mimeType", "image/*").load("/Volumes/<catalog>/<schema>/<volume>/images/")
display(df)
val df = spark.read.format("binaryFile").option("mimeType", "image/*").load("/Volumes/<catalog>/<schema>/<volume>/images/")
df.show()
SELECT * FROM read_files(
'/Volumes/<catalog>/<schema>/<volume>/images/',
format => 'binaryFile',
mimeType => 'image/*'
)

Consulte Soluções de referência para aplicativos de imagem para obter o fluxo de trabalho recomendado para lidar com dados de imagem.
Salvar em tabela Delta
Para melhorar o desempenho de leitura ao recarregar os dados, a Databricks recomenda salvar os dados carregados de arquivos binários em uma tabela Delta.
- Python
- Scala
df.write.format("delta").saveAsTable("<catalog>.<schema>.<table>")
df.write.format("delta").saveAsTable("<catalog>.<schema>.<table>")
Recursos adicionais
- Ler arquivos de imagem: Se sua carga de trabalho requer campos de imagem estruturados, como dados de altura, largura e canal, em vez de bytes brutos, a fonte de dados de imagem fornece um esquema decodificado.