Leia e escreva ficheiros JSON

JSON (JavaScript Object Notation) é um formato semi-estruturado amplamente utilizado para troca e armazenamento de dados. O Azure Databricks suporta JSON tanto para leitura como para escrita com o Apache Spark, incluindo modos de linha única e multilinha, inferência automática de esquema e dados resgatados. Pode ler ficheiros JSON a partir de armazenamento na cloud usando a API Spark DataFrame ou SQL, e escrever DataFrames de volta para JSON.

Pré-requisitos

O Azure Databricks não requer configuração adicional para utilizar ficheiros JSON.

Opções

Utilize os métodos .option() e .options() de DataFrameReader e DataFrameWriter para configurar fontes de dados JSON. Para uma lista completa de opções suportadas, consulte DataFrameReader opções JSON e DataFrameWriter opções JSON.

Usage

Os exemplos seguintes utilizam o conjunto de dados de exemplo Wanderbricks para demonstrar a leitura e escrita de ficheiros JSON em modos de linha única e multilinha, utilizando a API Spark DataFrame e SQL.

Escrever e ler ficheiros JSON

No modo de linha única (o padrão), cada linha da saída contém um objeto JSON completo. Escreve críticas do Wanderbricks em formato JSON e depois lê-as.

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)

linguagem de programação 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()

Ler ficheiros JSON multilinha

No modo multi-linha, um único objeto JSON pode abranger várias linhas. Ative o modo multi-linha para ler ficheiros JSON onde os registos são formatados em várias linhas.

Python

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

linguagem de programação 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)

Leia ficheiros JSON usando SQL

Podes usar a read_files função tabela com valores em tabela em SQL para ler ficheiros JSON.

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

Também podes usar USING JSON para ler ficheiros JSON. No entanto, a Databricks recomenda usar read_files em vez de USING JSON porque read_files permite especificar o esquema e opções adicionais de processamento de ficheiros.

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;

Especificar codificação de caracteres

Por padrão, o conjunto de caracteres dos arquivos de entrada é detetado automaticamente. Você pode especificar o conjunto de caracteres explicitamente usando a charset opção:

Python

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

linguagem de programação 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'
)

Alguns charsets suportados incluem: UTF-8, UTF-16BE, UTF-16LE, UTF-16, UTF-32BE, UTF-32LE, UTF-32. Para obter a lista completa de conjuntos de caracteres suportados pelo Oracle Java SE, consulte Supported Encodings.

Ativar a coluna de dados resgatados

A coluna de dados recuperados assegura que nunca se perdem dados durante o processo de ETL. Captura quaisquer dados que não tenham sido analisados porque um ou mais campos num registo apresentam um dos seguintes problemas:

  • Ausente do esquema fornecido.
  • Não corresponde ao tipo de dados do esquema fornecido.
  • Há uma incompatibilidade de maiúsculas e minúsculas nos nomes de campo do esquema fornecido.

A coluna de dados resgatados é devolvida como um blob JSON contendo as colunas resgatadas e o caminho do ficheiro fonte do registo.

Para ativar a coluna de dados recuperados, defina a opção rescuedDataColumn com um nome de coluna durante a leitura:

Python

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

linguagem de programação 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'
)

Para remover o caminho do ficheiro de origem da coluna de dados resgatados, defina:

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

O analisador JSON suporta três modos ao analisar registros: PERMISSIVE, DROPMALFORMEDe FAILFAST. Quando usados em conjunto com rescuedDataColumn, aplicam-se as seguintes regras:

  • As incompatibilidades entre tipos de dados não causam a perda de registos no DROPMALFORMED modo nem geram erro no FAILFAST modo.
  • Somente registros corrompidos, ou seja, JSON incompletos ou malformados, são descartados ou geram erros.
  • Se utilizar a opção badRecordsPath, as incompatibilidades de tipo de dados não são consideradas registos incorretos. Somente registros JSON incompletos e malformados são armazenados no badRecordsPath.

Recursos adicionais

  • Leia e escreva ficheiros Parquet: Se a sua carga de trabalho for principalmente analítica e com muita leitura, o layout colunar do Parquet oferece um desempenho de consulta mais eficiente do que o formato de texto baseado em linhas do JSON.
  • Leia e escreva ficheiros Avro: Se estiver a produzir ou a consumir JSON de um sistema de streaming de eventos como o Apache Kafka, o Avro oferece uma codificação binária mais compacta com suporte para evolução de esquema.