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.