Lire et écrire des fichiers JSON
JSON (JavaScript Object Notation) est un format semi-structuré largement utilisé pour l'échange et le stockage de données. Databricks prend en charge le format JSON pour la lecture et l'écriture avec Apache Spark, y compris les modes mono-ligne et multi-lignes, l'inférence automatique de schéma et la récupération des données. Vous pouvez lire les fichiers JSON du stockage cloud à l'aide de l'API Spark DataFrame ou de SQL, et réécrire les DataFrames au format JSON.
Prérequis
Databricks ne nécessite aucune configuration supplémentaire pour utiliser les fichiers JSON.
Options
Utilisez les méthodes .option() et .options() de DataFrameReader et DataFrameWriter pour configurer les sources de données JSON. Pour une liste complète des options prises en charge, voir options JSONDataFrameReader et options JSONDataFrameWriter.
Utilisation
Les exemples suivants utilisent l'exemple de dataset Wanderbricks pour démontrer la lecture et l'écriture de fichiers JSON en mode monoligne et multiligne à l'aide de l'API Spark DataFrame et de SQL.
Écriture et lecture de fichiers JSON
En mode monoligne (le default), chaque ligne de la sortie contient un objet JSON complet. Écrivez les avis Wanderbricks au format JSON, puis relisez-les.
- Python
- Scala
# Write wanderbricks reviews to JSON format
df = spark.read.table("samples.wanderbricks.reviews")
df.write.format("json").save("/Volumes/<catalog>/<schema>/<volume>/reviews_json")
# Read the JSON files into a DataFrame
df = spark.read.format("json").load("/Volumes/<catalog>/<schema>/<volume>/reviews_json")
df.printSchema()
display(df)
// Write wanderbricks reviews to JSON format
val reviews = spark.read.table("samples.wanderbricks.reviews")
reviews.write.format("json").save("/Volumes/<catalog>/<schema>/<volume>/reviews_json")
// Read the JSON files into a DataFrame
val df = spark.read.format("json").load("/Volumes/<catalog>/<schema>/<volume>/reviews_json")
df.printSchema()
df.show()
Lire les fichiers JSON multi-lignes
En mode multiligne, un seul objet JSON peut s'étendre sur plusieurs lignes. Activez le mode multiligne pour lire les fichiers JSON où les enregistrements sont formatés sur plusieurs lignes.
- Python
- Scala
- SQL
mdf = spark.read.option("multiline", "true").format("json").load("/Volumes/<catalog>/<schema>/<volume>/multi-line.json")
mdf.show(truncate=False)
val mdf = spark.read.option("multiline", "true").format("json").load("/Volumes/<catalog>/<schema>/<volume>/multi-line.json")
mdf.show(false)
CREATE TEMPORARY VIEW multiLineJsonTable
USING json
OPTIONS (path="/Volumes/<catalog>/<schema>/<volume>/multi-line.json",multiline=true)
Lire les fichiers JSON à l'aide de SQL
Vous pouvez utiliser la fonction à valeur de tableread_files en SQL pour lire les fichiers JSON.
SELECT * FROM read_files(
'/Volumes/<catalog>/<schema>/<volume>/reviews_json',
format => 'json',
multiLine => true)
Vous pouvez également utiliser USING JSON pour lire les fichiers JSON. Cependant, Databricks recommande d'utiliser read_files au lieu de USING JSON car read_files permet la spécification du schéma et des options de traitement de fichiers supplémentaires.
DROP TABLE IF EXISTS reviews_json_table;
CREATE TABLE reviews_json_table
USING JSON
OPTIONS (path "/Volumes/<catalog>/<schema>/<volume>/reviews_json", multiline true);
SELECT * FROM reviews_json_table;
Spécifier l'encodage des caractères
By default, le jeu de caractères des fichiers d'entrée est détecté automatiquement. Vous pouvez spécifier explicitement le jeu de caractères à l'aide de l'option charset :
- Python
- Scala
- SQL
spark.read.option("charset", "UTF-16BE").format("json").load("/Volumes/<catalog>/<schema>/<volume>/fileInUTF16.json")
spark.read.option("charset", "UTF-16BE").format("json").load("/Volumes/<catalog>/<schema>/<volume>/fileInUTF16.json")
SELECT * FROM read_files(
'/Volumes/<catalog>/<schema>/<volume>/fileInUTF16.json',
format => 'json',
charset => 'UTF-16BE'
)
Certains jeux de caractères pris en charge sont : UTF-8, UTF-16BE, UTF-16LE, UTF-16, UTF-32BE, UTF-32LE, UTF-32. Pour la liste complète des jeux de caractères pris en charge par Oracle Java SE, consultez Encodages pris en charge.
Activer la colonne de données récupérées
La colonne de données récupérées garantit que vous ne perdez jamais de données pendant l'ETL. Il capture toutes les données qui n'ont pas été analysées car un ou plusieurs champs d'un enregistrement présentent l'un des problèmes suivants :
- Absent du schéma fourni.
- Ne correspond pas au type de données du schéma fourni.
- Il y a une incohérence de casse avec les noms des champs dans le schéma fourni.
La colonne des données récupérées est renvoyée sous forme de blob JSON contenant les colonnes récupérées et le chemin du fichier source de l'enregistrement.
Pour activer la colonne de données récupérées, définissez l'option rescuedDataColumn sur un nom de colonne lors de la lecture :
- Python
- Scala
- SQL
df = spark.read.option("rescuedDataColumn", "_rescued_data").format("json").load("/Volumes/<catalog>/<schema>/<volume>/reviews_json")
val df = spark.read.option("rescuedDataColumn", "_rescued_data").format("json").load("/Volumes/<catalog>/<schema>/<volume>/reviews_json")
SELECT * FROM read_files(
'/Volumes/<catalog>/<schema>/<volume>/reviews_json',
format => 'json',
rescuedDataColumn => '_rescued_data'
)
Pour supprimer le chemin du fichier source de la colonne de données récupérées, définissez :
spark.conf.set("spark.databricks.sql.rescuedDataColumn.filePath.enabled", "false")
L'analyseur JSON prend en charge trois modes lors de l'analyse des enregistrements : PERMISSIVE, DROPMALFORMED et FAILFAST. Lorsqu'elles sont utilisées avec rescuedDataColumn, les règles suivantes s'appliquent :
- Les non-correspondances de type de données n'entraînent pas la suppression des enregistrements en mode
DROPMALFORMEDni le déclenchement d'une erreur en modeFAILFAST. - Seuls les enregistrements corrompus — c'est-à-dire les JSON incomplets ou malformés — sont supprimés ou génèrent des erreurs.
- Si vous utilisez l'option
badRecordsPath, les incompatibilités de type de données ne sont pas considérées comme de mauvais enregistrements. Seuls les enregistrements JSON incomplets et mal formés sont stockés dansbadRecordsPath.
Ressources supplémentaires
- Lire et écrire des fichiers Parquet: si votre charge de travail est principalement analytique et à forte lecture, la disposition en colonnes de Parquet offre des performances de query plus efficaces que le format texte basé sur les lignes de JSON.
- Lire et écrire des fichiers Avro: Si vous produisez ou consommez du JSON à partir d'un système de streaming d'événements tel qu'Apache Kafka, Avro offre un encodage binaire plus compact avec la prise en charge de l'évolution des schémas.