Ler e gravar arquivos JSON

JSON (JavaScript Object Notation) é um formato semiestruturado amplamente usado para troca e armazenamento de dados. Azure Databricks dá suporte ao JSON para leitura e gravação com o Apache Spark, incluindo modos de linha única e várias linhas, inferência automática de esquema e dados resgatados. Você pode ler arquivos JSON do armazenamento em nuvem usando a API do DataFrame do Spark ou o SQL e gravar DataFrames novamente no JSON.

Pré-requisitos

Azure Databricks não requer configuração adicional para usar arquivos JSON.

Opções

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

Usage

Os exemplos a seguir usam o conjunto de dados de exemplo do Wanderbricks para demonstrar a leitura e gravação de arquivos JSON em modos de linha única e várias linhas usando a API do DataFrame do Spark e o SQL.

Gravar e ler arquivos JSON

No modo de linha única (o padrão), cada linha da saída contém um objeto JSON completo. Escreva as revisões do Wanderbricks no formato JSON e leia-as novamente.

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

// 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 arquivos JSON de várias linhas

No modo de várias linhas, um único objeto JSON pode abranger várias linhas. Habilite o modo de várias linhas para ler arquivos JSON em que os registros 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)

Scala (linguagem de programação)

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)

Ler arquivos JSON usando SQL

Você pode usar a read_files função com valor de tabela no SQL para ler arquivos JSON.

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

Você também pode usar USING JSON para ler arquivos JSON. No entanto, o Databricks recomenda usar read_files em vez de USING JSON porque read_files permite a especificação de esquema e opções adicionais de processamento de arquivo.

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 de arquivos de entrada é detectado automaticamente. Você pode especificar o conjunto de caracteres explicitamente usando a opção charset:

Python

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

Scala (linguagem de programação)

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 conjuntos de caracteres com suporte incluem: UTF-8, UTF-16BE, UTF-16LE, UTF-16, UTF-32BE, UTF-32LE e UTF-32. Para ver a lista completa de conjuntos de caracteres com suporte pelo Oracle Java ES, confira Codificações com suporte.

Habilitar a coluna de dados resgatados

A coluna de dados resgatada garante que você nunca perca dados durante o ETL. Ele captura todos os dados que não foram analisados porque um ou mais campos em um registro têm um dos seguintes problemas:

  • Ausente do esquema fornecido.
  • Não corresponde ao tipo de dados do esquema fornecido.
  • Tem uma incompatibilidade de maiúsculas e minúsculas com os nomes de campo no esquema fornecido.

A coluna de dados resgatados é retornada como um blob JSON que contém as colunas resgatadas e o caminho do arquivo de origem do registro.

Para habilitar a coluna de dados resgatada, defina a opção rescuedDataColumn como um nome de coluna ao ler:

Python

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

Scala (linguagem de programação)

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 arquivo de origem da coluna de dados resgatada, defina:

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

O analisador JSON dá suporte a três modos ao analisar registros: PERMISSIVE, DROPMALFORMED e FAILFAST. Quando usadas em conjunto com rescuedDataColumn, as seguintes regras se aplicam:

  • Incompatibilidades de tipos de dados não fazem com que registros sejam descartados no modo DROPMALFORMED nem provoquem um erro no modo FAILFAST.
  • Somente registros corrompidos, como JSON incompleto ou malformado, são descartados ou geram erros.
  • Se você usar a opção badRecordsPath , as incompatibilidades de tipo de dados não serão consideradas registros inválidos. Somente registros JSON incompletos e malformados são armazenados em badRecordsPath.

Recursos adicionais

  • Ler e gravar arquivos Parquet: se sua carga de trabalho for principalmente analítica e de leitura pesada, o layout de coluna do Parquet oferecerá um desempenho de consulta mais eficiente do que o formato de texto baseado em linha do JSON.
  • Ler e gravar arquivos Avro: se você estiver produzindo ou consumindo JSON de um sistema de streaming de eventos como o Apache Kafka, o Avro fornecerá uma codificação binária mais compacta com suporte à evolução do esquema.