Чтение и запись JSON-файлов

JSON (нотация объектов JavaScript) — это широко используемый полуструктурированный формат для обмена данными и хранения. Azure Databricks поддерживает JSON для чтения и записи в Apache Spark, включая однострочный и многострочный режимы, автоматическое определение схемы и восстанавливаемые данные. Файлы JSON можно считывать из облачного хранилища с помощью API Spark DataFrame или SQL, а также записывать объекты DataFrame обратно в формат JSON.

Необходимые условия

Azure Databricks не требует дополнительной конфигурации для использования JSON-файлов.

Параметры

Используйте методы .option() и .options() элементов DataFrameReader и DataFrameWriter для настройки источников данных JSON. Полный список поддерживаемых параметров см. в параметрах DataFrameReader JSON и DataFrameWriter параметрах JSON.

Usage

В следующих примерах используется пример набора данных Wanderbricks для демонстрации чтения и записи JSON-файлов в однострочных и многострочных режимах с помощью API Кадра данных Spark и SQL.

Запись и чтение JSON-файлов

В одностроочном режиме (по умолчанию) каждая строка выходных данных содержит один полный объект JSON. Запишите отзывы о Wanderbricks в формате JSON, а затем прочитайте их обратно.

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

Чтение файлов JSON с несколькими строками

В многостроочном режиме один объект JSON может охватывать несколько строк. Включите многострочный режим для чтения JSON-файлов, в которых записи форматируются в нескольких строках.

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-файлов с помощью SQL

Вы можете использовать табличную функцию с табличным значением в SQL для чтения JSON-файлов.read_files

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

Можно также использовать USING JSON для чтения JSON-файлов. Однако Databricks рекомендует использовать read_files вместо USING JSON потому что read_files позволяет указывать схему и дополнительные параметры обработки файлов.

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;

Указание кодировки символов

По умолчанию кодировка входных файлов определяется автоматически. Вы можете также указать кодировку явным образом с помощью параметра charset:

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

Среди прочего, поддерживаются следующие кодировки: UTF-8, UTF-16BE, UTF-16LE, UTF-16, UTF-32BE, UTF-32LE, UTF-32. Полный список поддерживаемых в Oracle Java SE кодировок см. на странице Supported Encodings (Поддерживаемые кодировки).

Включить столбец восстановленных данных

Столбец спасенных данных гарантирует, что данные во время ETL никогда не теряются. Он записывает данные, которые не были проанализированы, так как в одной или нескольких полях записи возникает одна из следующих проблем:

  • Отсутствует в предоставленной схеме.
  • Не соответствует типу данных предоставленной схемы.
  • Имеется несовпадение регистра с названиями полей в предоставленной схеме.

Спасательный столбец данных возвращается в виде большого двоичного объекта JSON, содержащего спасаемые столбцы и путь к исходному файлу записи.

Чтобы включить резервный столбец данных, задайте для параметра rescuedDataColumn имя столбца при чтении:

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

Чтобы удалить путь к исходному файлу из спасаемого столбца данных, установите следующий параметр:

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

Анализатор JSON поддерживает три режима анализа записей: PERMISSIVE, DROPMALFORMED и FAILFAST. При совместном использовании rescuedDataColumnприменяются следующие правила:

  • Несоответствия типов данных не приводят к тому, что записи будут удалены в DROPMALFORMED режиме или возникают ошибки в FAILFAST режиме.
  • Будут отброшены или вызовут ошибку только поврежденные записи, т.е. неполный или некорректный JSON.
  • Если вы используете этот badRecordsPath параметр, несоответствия типов данных не считаются плохими записями. В badRecordsPath хранятся только неполные и неправильные записи JSON.

Дополнительные ресурсы

  • Чтение и запись файлов Parquet. Если рабочая нагрузка в первую очередь является аналитической и тяжелой для чтения, макет столбца Parquet обеспечивает более эффективную производительность запросов, чем текстовый формат на основе строк JSON.
  • Чтение и запись файлов Avro: если вы создаёте или обрабатываете JSON в системе потоковой передачи событий, например Apache Kafka, Avro обеспечивает более компактное двоичное кодирование с поддержкой эволюции схем.