Odczytywanie i zapisywanie plików JSON

JSON (JavaScript Object Notation) to powszechnie używany częściowo ustrukturyzowany format wymiany i przechowywania danych. Azure Databricks obsługuje format JSON do odczytu i zapisu w Apache Spark, w tym tryb jednowierszowy i wielowierszowy, automatyczne wnioskowanie o schemacie oraz dane odzyskane. Pliki JSON można odczytywać z magazynu w chmurze przy użyciu interfejsu API ramki danych platformy Spark lub języka SQL i zapisywać ramki danych z powrotem do formatu JSON.

Prerequisites

Azure Databricks nie wymaga dodatkowej konfiguracji do korzystania z plików JSON.

Opcje

.option() Użyj metod .options() i DataFrameReader , DataFrameWriter aby skonfigurować źródła danych JSON. Aby uzyskać pełną listę obsługiwanych opcji, zobacz DataFrameReader opcje JSON i DataFrameWriter opcje JSON.

Usage

W poniższych przykładach użyto przykładowego zestawu danych Wanderbricks, aby zademonstrować odczyt i zapis plików JSON w trybie jednowierszowym i wielowierszowym przy użyciu interfejsu API Spark DataFrame oraz języka SQL.

Zapisywanie i odczytywanie plików JSON

W trybie jednowierszowym (domyślnym) każdy wiersz danych wyjściowych zawiera jeden kompletny obiekt JSON. Napisz recenzje Wanderbricks do formatu JSON, a następnie przeczytaj je z powrotem.

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)

Skala

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

Odczytywanie wielowierszowych plików JSON

W trybie wielowierszowym pojedynczy obiekt JSON może obejmować wiele wierszy. Włącz tryb wielowierszowy, aby odczytywać pliki JSON, w których rekordy są formatowane w wielu wierszach.

Python

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

Skala

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)

Odczytywanie plików JSON przy użyciu języka SQL

Funkcję wartości tabelarycznych w języku SQL można używać do odczytywania plików JSON.

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

Możesz również użyć USING JSON polecenia , aby odczytać pliki JSON. Jednak usługa Databricks zaleca użycie read_files zamiast USING JSON , ponieważ read_files umożliwia określenie schematu i dodatkowych opcji przetwarzania plików.

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;

Określanie kodowania znaków

Domyślnie zestaw znaków plików wejściowych jest wykrywany automatycznie. Możesz jawnie określić zestaw znaków przy użyciu charset opcji :

Python

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

Skala

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

Niektóre obsługiwane zestawy znaków to: UTF-8, , UTF-16BE, UTF-16LEUTF-16, UTF-32BE, UTF-32LE, . UTF-32 Aby uzyskać pełną listę zestawów znaków obsługiwanych przez program Oracle Java SE, zobacz Supported Encodings.

Włącz kolumnę odzyskanych danych

Uratowana kolumna danych gwarantuje, że nigdy nie utracisz danych podczas etL. Przechwytuje wszystkie dane, które nie zostały przeanalizowane, ponieważ co najmniej jedno pole w rekordzie ma jeden z następujących problemów:

  • Brak podanego schematu.
  • Nie jest zgodny z typem danych podanego schematu.
  • Ma niezgodność pisowni liter z nazwami pól w podanym schemacie.

Uratowana kolumna danych jest zwracana jako obiekt blob JSON zawierający uratowane kolumny i ścieżkę pliku źródłowego rekordu.

Aby włączyć kolumnę odzyskanych danych, ustaw opcję rescuedDataColumn na nazwę kolumny podczas wczytywania:

Python

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

Skala

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

Aby usunąć ścieżkę pliku źródłowego z uratowanej kolumny danych, ustaw:

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

Analizator JSON obsługuje trzy tryby podczas analizowania rekordów: PERMISSIVE, DROPMALFORMEDi FAILFAST. W przypadku używania razem z rescuedDataColumn, obowiązują następujące zasady:

  • Niezgodności typów danych nie powodują odrzucania rekordów w trybie DROPMALFORMED ani zgłoszenia błędu w trybie FAILFAST.
  • Tylko uszkodzone rekordy — czyli niekompletne lub źle sformułowane dane JSON — są porzucane lub zgłaszane są błędy.
  • Jeśli używasz badRecordsPath opcji, niezgodności typów danych nie są uznawane za nieprawidłowe rekordy. W pliku badRecordsPathsą przechowywane tylko niekompletne i źle sformułowane rekordy JSON.

Dodatkowe zasoby

  • Odczytywanie i zapisywanie plików Parquet: jeśli obciążenie ma głównie charakter analityczny i jest zdominowane przez operacje odczytu, kolumnowy układ Parquet zapewnia wyższą wydajność zapytań niż tekstowy format JSON oparty na wierszach.
  • Odczytywanie i zapisywanie plików Avro: w przypadku tworzenia lub używania kodu JSON z systemu przesyłania strumieniowego zdarzeń, takiego jak Apache Kafka, avro zapewnia bardziej kompaktowe kodowanie binarne z obsługą ewolucji schematu.