JSON-fájlok olvasása és írása

A JSON (JavaScript Object Notation) egy széles körben használt félig strukturált formátum az adatcseréhez és a tároláshoz. Azure Databricks támogatja a JSON-t az Apache Sparkkal való olvasáshoz és íráshoz, beleértve az egysoros és többsoros módokat, az automatikus sémakövető és a mentett adatokat. JSON-fájlokat olvashat a felhőbeli tárolóból a Spark DataFrame API vagy az SQL használatával, és visszaírhatja a DataFrame-eket a JSON-ba.

Prerequisites

Azure Databricks nem igényel további konfigurációt a JSON-fájlok használatához.

Beállítások

A JSON-adatforrások konfigurálásához használja a(z) .option() és .options()DataFrameReader és DataFrameWriter metódusait. A támogatott beállítások teljes listáját a JSON-beállítások és a JSON-beállítások című témakörben találjaDataFrameReader.DataFrameWriter

Usage

Az alábbi példák a Wanderbricks-mintaadatkészlet használatával mutatják be a JSON-fájlok egysoros és többsoros módban történő olvasását és írását a Spark DataFrame API és az SQL használatával.

JSON-fájlok írása és olvasása

Egysoros módban (alapértelmezett) a kimenet minden sora egy teljes JSON-objektumot tartalmaz. Írjon Wanderbricks-véleményeket JSON-formátumba, majd olvassa vissza őket.

Python

# 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)

Scala

// 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()

Többsoros JSON-fájlok olvasása

Többsoros módban egyetlen JSON-objektum több sorra is kiterjedhet. Többsoros mód engedélyezése olyan JSON-fájlok olvasásához, amelyekben a rekordok több sorban vannak formázva.

Python

mdf = spark.read.option("multiline", "true").format("json").load("/Volumes/<catalog>/<schema>/<volume>/multi-line.json")
mdf.show(truncate=False)

Scala

val mdf = spark.read.option("multiline", "true").format("json").load("/Volumes/<catalog>/<schema>/<volume>/multi-line.json")
mdf.show(false)

SQL

CREATE TEMPORARY VIEW multiLineJsonTable
USING json
OPTIONS (path="/Volumes/<catalog>/<schema>/<volume>/multi-line.json",multiline=true)

JSON-fájlok olvasása AZ SQL használatával

JSON-fájlok olvasásához használhatja az read_files SQL táblaértékű függvényét .

SELECT * FROM read_files(
  '/Volumes/<catalog>/<schema>/<volume>/reviews_json',
  format => 'json',
  multiLine => true)

JSON-fájlok olvasására is használható USING JSON . A Databricks azonban azt javasolja, hogy inkább read_files használjuk USING JSON helyett, mert a read_files lehetővé teszi a séma és a további fájlfeldolgozási lehetőségek specifikációját.

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;

Karakterkódolás megadása

Alapértelmezés szerint a bemeneti fájlok karakterkészlete automatikusan észlelhető. A karakterkészletet explicit módon is megadhatja a charset következő beállítással:

Python

spark.read.option("charset", "UTF-16BE").format("json").load("/Volumes/<catalog>/<schema>/<volume>/fileInUTF16.json")

Scala

spark.read.option("charset", "UTF-16BE").format("json").load("/Volumes/<catalog>/<schema>/<volume>/fileInUTF16.json")

SQL

SELECT * FROM read_files(
  '/Volumes/<catalog>/<schema>/<volume>/fileInUTF16.json',
  format => 'json',
  charset => 'UTF-16BE'
)

Néhány támogatott karakterkészlet: UTF-8, , UTF-16BE, UTF-16LE, UTF-16UTF-32BE, , UTF-32LEUTF-32. Az Oracle Java SE által támogatott karakterkészletek teljes listáját Támogatott kódolásokcímű témakörben találja.

A mentett adatoszlop engedélyezése

A mentett adatoszlop biztosítja, hogy az ETL során soha ne veszítsen el adatokat. Rögzíti azokat az adatokat, amelyeket nem elemeztek, mert egy rekord egy vagy több mezője az alábbi problémák egyikével rendelkezik:

  • Hiányzik a megadott sémából.
  • Nem egyezik a megadott séma adattípusával.
  • A megadott séma mezőneveivel kis- és nagybetű érzékenység tekintetében nem egyezik meg.

A mentett adatoszlop JSON-blobként lesz visszaadva, amely tartalmazza a mentett oszlopokat és a rekord forrásfájljának elérési útját.

A helyreállított adatok oszlopának engedélyezéséhez beolvasáskor állítsa a(z) rescuedDataColumn beállítást egy oszlopnévre:

Python

df = spark.read.option("rescuedDataColumn", "_rescued_data").format("json").load("/Volumes/<catalog>/<schema>/<volume>/reviews_json")

Scala

val df = spark.read.option("rescuedDataColumn", "_rescued_data").format("json").load("/Volumes/<catalog>/<schema>/<volume>/reviews_json")

SQL

SELECT * FROM read_files(
  '/Volumes/<catalog>/<schema>/<volume>/reviews_json',
  format => 'json',
  rescuedDataColumn => '_rescued_data'
)

Ha el szeretné távolítani a forrásfájl elérési útját a mentett adatoszlopból, állítsa be a következőt:

spark.conf.set("spark.databricks.sql.rescuedDataColumn.filePath.enabled", "false")

A JSON-elemző három módot támogat a rekordok elemzésekor: PERMISSIVE, DROPMALFORMEDés FAILFAST. Együtt használva rescuedDataColumna következő szabályok érvényesek:

  • Az adattípus-eltérések nem eredményezik a rekordok eldobását DROPMALFORMED módban, és nem váltanak ki hibát FAILFAST módban.
  • A rendszer csak a sérült rekordokat – azaz hiányos vagy hibásan formázott JSON-rekordokat – elveti vagy hibát jelez.
  • Ha ezt a lehetőséget használja, az badRecordsPath adattípus eltérései nem minősülnek rossz rekordnak. A rendszer csak hiányos és hibás JSON-rekordokat tárol.badRecordsPath

További források

  • Parquet-fájlok olvasása és írása: Ha a számítási feladat elsősorban elemzési és olvasási nehéz, a Parquet oszlopos elrendezése hatékonyabb lekérdezési teljesítményt nyújt, mint a JSON soralapú szövegformátuma.
  • Avro-fájlok olvasása és írása: Ha JSON-t készít vagy használ egy eseménystreamelési rendszerből, például az Apache Kafkából, az Avro kompaktabb bináris kódolást biztosít sémafejlődési támogatással.