Čtení a zápis souborů JSON

JSON (JavaScript Object Notation) je široce používaný částečně strukturovaný formát pro výměnu a ukládání dat. Azure Databricks podporuje JSON pro čtení i zápis pomocí Apache Sparku, včetně jednořádkových a víceřádkových režimů, automatického odvozování schématu a záchranných dat. Soubory JSON můžete číst z cloudového úložiště pomocí rozhraní API datového rámce Sparku nebo SQL a zapisovat datové rámce zpět do formátu JSON.

Předpoklady

Azure Databricks nevyžaduje další konfiguraci pro použití souborů JSON.

Možnosti

Ke konfiguraci zdrojů dat JSON použijte metody .option() a .options() objektů DataFrameReader a DataFrameWriter. Úplný seznam podporovaných možností najdete v tématu DataFrameReader Možnosti JSON a DataFrameWriter možnosti JSON.

Usage

Následující příklady používají ukázkovou datovou sadu Wanderbricks k předvedení čtení a zápisu souborů JSON v jednořádkovém a víceřádkovém režimu pomocí rozhraní API datového rámce Sparku a SQL.

Zápis a čtení souborů JSON

V jednořádkovém režimu (výchozí nastavení) každý řádek výstupu obsahuje jeden úplný objekt JSON. Napište recenze Wanderbricks do formátu JSON a pak je znovu přečtěte.

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

Čtení víceřádkových souborů JSON

V režimu víceřádkového režimu může jeden objekt JSON překlenovat více řádků. Povolte režim víceřádkového čtení souborů JSON, ve kterých jsou záznamy formátované napříč více řádky.

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)

Čtení souborů JSON pomocí SQL

Ke čtení souborů JSON můžete použít read_files funkci tabulkové funkce s hodnotou tabulky v SQL.

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

Můžete také použít USING JSON ke čtení souborů JSON. Databricks ale místo toho doporučuje použití read_filesUSING JSON , protože read_files umožňuje specifikaci schématu a další možnosti zpracování souborů.

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;

Určení kódování znaků

Ve výchozím nastavení se znaková sada vstupních souborů rozpozná automaticky. Znakovou sadu můžete explicitně zadat pomocí charset možnosti:

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

Mezi podporované znakové sady patří: UTF-8, UTF-16BE, UTF-16LE, UTF-16, UTF-32BE, UTF-32LE, . UTF-32 Úplný seznam znakových sad podporovaných Oracle Java SE najdete v části Podporované kódování.

Povolte sloupec se zachráněnými daty

Sloupec zachráněných dat zajišťuje, že během ETL nikdy nepřijdete o data. Zaznamenává všechna data, která nebyla analyzována, protože jedno nebo více polí v záznamu má jeden z následujících problémů:

  • Chybí ze zadaného schématu.
  • Neodpovídá datovému typu zadaného schématu.
  • Neshoduje se s názvy polí v zadaném schématu.

Uložený datový sloupec se vrátí jako objekt blob JSON obsahující záchranné sloupce a cestu ke zdrojovému souboru záznamu.

Chcete-li povolit sloupec pro zachráněná data, nastavte při čtení možnost rescuedDataColumn na název sloupce:

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

Pokud chcete odebrat cestu ke zdrojovému souboru ze sloupce zachráněných dat, nastavte:

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

Analyzátor JSON podporuje při analýze záznamů tři režimy: PERMISSIVE, DROPMALFORMEDa FAILFAST. Při použití společně s rescuedDataColumn platí následující pravidla:

  • Neshody datových typů nezpůsobí vyřazení záznamů v DROPMALFORMED režimu nebo vyvolání chyby v FAILFAST režimu.
  • Zahodí se jenom poškozené záznamy ( tj. neúplné nebo poškozené JSON) nebo vyvolá chyby.
  • Pokud použijete badRecordsPath tuto možnost, neshody datových typů se nepovažují za chybné záznamy. Jsou uloženy pouze neúplné a poškozené záznamy JSON v badRecordsPath.

Dodatečné zdroje

  • Čtení a zápis souborů Parquet: Pokud je vaše úloha primárně analytická a silná pro čtení, sloupcové rozložení Parquet nabízí efektivnější výkon dotazů než textový formát založený na řádcích JSON.
  • Čtení a zápis souborů Avro: Pokud vytváříte nebo využíváte JSON ze systému streamování událostí, jako je Apache Kafka, Avro poskytuje kompaktnější binární kódování s podporou vývoje schématu.