Lisez les fichiers binaires
Databricks prend en charge la source de données de fichier binaire, qui lit les fichiers binaires et convertit chaque fichier en un seul enregistrement contenant le contenu brut et les métadonnées du fichier. Il est couramment utilisé pour charger des données non structurées telles que des images, de l’audio ou des fichiers PDF pour un traitement en aval ou une inférence ML. Pour lire des fichiers binaires, spécifiez la source de données format comme binaryFile.
Prérequis
Databricks ne nécessite pas de configuration supplémentaire pour utiliser les fichiers binaires.
Options
Utilisez les méthodes .option() et .options() de DataFrameReader pour configurer la source de données de fichiers binaires. Pour une liste complète des options prises en charge, voir référence des options Spark API.
Schéma de sortie
La source de données de fichier binaire produit un DataFrame avec les colonnes suivantes, plus toutes les colonnes de partition :
path (StringType): Le chemin d’accès du fichier.modificationTime (TimestampType): l’heure de modification du fichier. Dans certaines implémentations de système de fichiers Hadoop, ce paramètre peut être indisponible et la valeur serait définie par default.length (LongType): La longueur du fichier en octets.content (BinaryType): Le contenu du fichier.
Utilisation
Les exemples suivants illustrent le chargement de fichiers binaires à l'aide de l'API Spark DataFrame et de SQL, le filtrage par type de fichier, l'affichage des aperçus d'images et l'enregistrement dans une table Delta pour des performances de lecture améliorées.
Lisez les fichiers binaires
Utilisez l'API Apache Spark DataFrame pour charger des fichiers binaires dans un DataFrame pour la transformation, l'affichage ou le traitement en aval.
- 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'
)
Configurer les options de lecture
Pour charger des fichiers dont les chemins correspondent à un modèle glob donné tout en conservant le comportement de découverte de partition, vous pouvez utiliser l'option pathGlobFilter. Le code suivant lit tous les fichiers JPG du répertoire d'entrée avec la découverte de partition :
- 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'
)
Si vous souhaitez ignorer la découverte de partition et rechercher des fichiers de manière récursive dans le répertoire d'entrée,
utilisez l'option recursiveFileLookup. Cette option recherche dans les répertoires imbriqués
même si leurs noms ne suivent pas un schéma de nommage de partition comme date=2019-07-01.
Le code suivant lit tous les fichiers JPG de manière récursive à partir du répertoire d'entrée et ignore la découverte de partition :
- 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
)
Charger et afficher des images
Databricks vous recommande d'utiliser la source de données de fichier binaire pour charger des données d'image. La fonction display de Databricks prend en charge l'affichage des données d'image chargées à l'aide de la source de données binaires.
Si tous les fichiers chargés ont un nom de fichier avec une extension d'image, l'aperçu de l'image est automatiquement activé :
- 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'
)

Vous pouvez également forcer la fonctionnalité de prévisualisation d'image en utilisant l'option mimeType avec une valeur de chaîne "image/*" pour annoter la colonne binaire. Les images sont décodées en fonction de leurs informations de format dans le contenu binaire. Les types d'image pris en charge sont bmp, gif, jpeg et png. Les fichiers non pris en charge apparaissent sous la forme d'une icône d'image cassée.
- 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/*'
)

Consultez la solution de référence pour les applications d'images pour le workflow recommandé afin de gérer les données d'image.
Enregistrer dans une table Delta
Pour améliorer les performances de lecture lorsque vous rechargez des données, Databricks recommande d'enregistrer les données chargées depuis des fichiers binaires dans une table Delta.
- Python
- Scala
df.write.format("delta").saveAsTable("<catalog>.<schema>.<table>")
df.write.format("delta").saveAsTable("<catalog>.<schema>.<table>")
Ressources supplémentaires
- Lire les fichiers image: si votre charge de travail requiert des champs d’image structurés tels que la hauteur, la largeur et les données du canal de distribution plutôt que des octets bruts, la source de données d’image fournit un schéma décodé.