Pular para o conteúdo principal

Ler e gravar arquivos JSON

JSON (JavaScript Object Notation) é um formato semiestruturado amplamente utilizado para troca e armazenamento de dados. Databricks oferece suporte a JSON para leitura e gravação com Apache Spark, incluindo modos de linha única e multilinha, inferência automática de esquema e dados resgatados. É possível ler arquivos JSON de armazenamento em cloud usando a API Spark DataFrame ou SQL e gravar DataFrames de volta para JSON.

Pré-requisitos​

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

Opções​

Use os métodos .option() e .options() de DataFrameReader e DataFrameWriter para configurar a fonte de dados JSON . Para obter uma lista completa das opções suportadas, consulte DataFrameReader Opções JSON e DataFrameWriter Opções JSON.

Uso​

Os exemplos a seguir usam o dataset de amostra Wanderbricks para demonstrar a leitura e a gravação de arquivos JSON nos modos de linha única e multilinha usando a API Spark DataFrame e SQL.

Gravar e read.json​

No modo de linha única (o default), cada linha da saída contém um objeto JSON completo. Gravar avaliações do Wanderbricks no formato JSON e depois lê-las de volta.

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)

Ler arquivos JSON com várias linhas​

No modo de múltiplas linhas, um único objeto JSON pode abranger múltiplas linhas. Habilitar modo multilinhas para ler arquivos JSON onde os registros são formatados em múltiplas linhas.

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

read.json arquivos .json usando SQL​

Você pode usar a função de tabelaread_files em SQL para read.json arquivos .json.

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

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

SQL
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​

Em default, o charset dos 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")

Alguns conjuntos de caracteres compatíveis 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 Codificações suportadas.

Habilitar a coluna de dados resgatados​

A coluna de dados resgatados garante que não se percam dados durante o ETL. Captura todos os dados que não foram analisados porque um ou mais campos em um registro apresentam um dos seguintes problemas:

  • Ausente do esquema informado.
  • Não corresponde ao tipo de dados do esquema informado.
  • Tem incompatibilidade de maiúsculas e minúsculas nos nomes de campos no esquema informado.

A coluna de dados resgatados é retornada como um documento JSON contendo as colunas resgatadas e o caminho do arquivo de origem do registro.

Para ativar a coluna de dados resgatados, defina a opção rescuedDataColumn para um nome de coluna na leitura:

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

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

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

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

  • As incompatibilidades de tipo de dados não fazem com que os registros sejam eliminados no modo DROPMALFORMED nem geram um erro no modo FAILFAST.
  • Somente registros corrompidos, ou seja, JSON incompleto ou malformado, são descartados ou geram erros.
  • Se o senhor usar a opção badRecordsPath, incompatibilidades de tipo de dados não serão consideradas registros ruins. Somente registros JSON incompletos e malformados são armazenados em badRecordsPath.

Recursos adicionais​

  • Leia e grave arquivos Parquet: se sua carga de trabalho for principalmente analítica e intensiva em leitura, a disposição colunar do Parquet oferece um desempenho de consulta mais eficiente do que o formato de texto baseado em linha do JSON.
  • Ler e escrever arquivos Avro: Se você está produzindo ou consumindo JSON de um sistema de transmissão de eventos como Apache Kafka, o Avro oferece uma codificação binária mais compacta com suporte à evolução do esquema.