Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Azure Databricks dá 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. Normalmente, ele é usado para carregar dados não estruturados, como imagens, áudio ou arquivos PDF para processamento downstream ou inferência de ML. Para ler arquivos binários, especifique a fonte de dados format como binaryFile.
Pré-requisitos
Azure Databricks não requer 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 de opções com suporte, consulte a referência de opções de API do Spark.
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): date e hora de modificação do arquivo. Em algumas implementações de FileSystem do Hadoop, esse parâmetro pode estar indisponível e o valor seria definido como um valor padrão. -
length (LongType): o tamanho do arquivo em bytes. -
content (BinaryType): o conteúdo do arquivo.
Usage
Os exemplos a seguir demonstram o carregamento de arquivos binários usando a API e o SQL do DataFrame do Spark, filtrando por tipo de arquivo, exibindo visualizações de imagem e salvando em uma tabela Delta para melhorar o desempenho de leitura.
Ler arquivos binários
Use a API de DataFrame do Apache Spark para carregar arquivos binários em um DataFrame para transformação, exibição ou processamento downstream.
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 arquivos cujos caminhos correspondam a um determinado padrão glob, preservando o comportamento de 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
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'
)
Para ignorar a descoberta de partição e pesquisar arquivos recursivamente no diretório de entrada, use a opção recursiveFileLookup. Essa opção pesquisa os diretórios aninhados, mesmo que os nomes deles não sigam um esquema de nomenclatura de partição 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 usar a fonte de dados de arquivo binário para carregar dados de imagem. A função Databricks display dá suporte à 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á habilitada 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'
)
Como alternativa, você 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 nas respectivas informações de formato no conteúdo binário. Os tipos de imagem com suporte são bmp, gifjpeg e png. Os arquivos sem suporte aparecem como um ícone de imagem quebrada.
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/*'
)
Consulte Solução de referência para aplicativos de imagem para informar-se sobre o fluxo de trabalho recomendado para manipular dados de imagem.
Salvar na tabela Delta
Para melhorar o desempenho de leitura ao carregar dados de volta, Azure Databricks recomenda salvar dados carregados de arquivos binários em uma tabela Delta.
Python
df.write.format("delta").saveAsTable("<catalog>.<schema>.<table>")
Scala
df.write.format("delta").saveAsTable("<catalog>.<schema>.<table>")
Recursos adicionais
- Ler arquivos de imagem: se a carga de trabalho exigir campos de imagem estruturados, como altura, largura e dados de canal em vez de bytes brutos, a fonte de dados da imagem fornecerá um esquema decodificado.