arquivo JSON

Você pode ler arquivos JSON no modo de linha únicaou de várias linhas. No modo de linha única, um arquivo pode ser dividido em várias partes e lido em paralelo. No modo de várias linhas, um arquivo é carregado como uma entidade inteira e não pode ser dividido.

Para obter mais informações, confira Arquivos JSON.

Opções

Confira os seguintes artigos de referência sobre o Apache Spark para ver opções de leitura e gravação com suporte.

Coluna de dados resgatados

Observação

Esse recurso está disponível no Databricks Runtime 8.2 (EoS) e posterior.

A coluna de dados resgatados garante que você nunca perca ou ignore dados durante o ETL. A coluna de dados resgatados contém todos os dados que não foram analisados porque estavam faltando no esquema fornecido, porque houve uma incompatibilidade de tipo ou porque as maiúsculas e minúsculas da coluna no registro ou arquivo não correspondiam ao que estava no esquema. A coluna de dados resgatada é retornada como um blob JSON que contém as colunas que foram resgatadas e o caminho do arquivo de origem do registro. Para remover o caminho do arquivo de origem da coluna de dados resgatados, defina a configuração de SQL spark.conf.set("spark.databricks.sql.rescuedDataColumn.filePath.enabled", "false"). É possível habilitar a coluna de dados resgatados definindo a opção rescuedDataColumn como um nome de coluna, como _rescued_data com spark.read.option("rescuedDataColumn", "_rescued_data").format("json").load(<path>).

O analisador JSON dá suporte a três modos ao analisar registros: PERMISSIVE, DROPMALFORMED e FAILFAST. Quando usado junto a rescuedDataColumn, as incompatibilidades de tipo de dados não fazem com que os registros sejam removidos no modo DROPMALFORMED ou geram um erro no modo FAILFAST. Somente registros corrompidos, como JSON incompleto ou malformado, são descartados ou geram erros. Se você usar badRecordsPath para analisar JSON, as incompatibilidades de tipo de dados não serão consideradas como registros inválidos ao usar o rescuedDataColumn. Somente registros JSON incompletos e malformados são armazenados em badRecordsPath.

Exemplos

Modo de linha única

Neste exemplo, há um objeto JSON por linha:

{"string":"string1","int":1,"array":[1,2,3],"dict": {"key": "value1"}}
{"string":"string2","int":2,"array":[2,4,6],"dict": {"key": "value2"}}
{"string":"string3","int":3,"array":[3,6,9],"dict": {"key": "value3", "extra_key": "extra_value3"}}

Para ler os dados JSON, use:

val df = spark.read.format("json").load("example.json")

O Spark infere o esquema automaticamente.

df.printSchema
root
 |-- array: array (nullable = true)
 |    |-- element: long (containsNull = true)
 |-- dict: struct (nullable = true)
 |    |-- extra_key: string (nullable = true)
 |    |-- key: string (nullable = true)
 |-- int: long (nullable = true)
 |-- string: string (nullable = true)

Modo de várias linhas

Esse objeto JSON ocupa várias linhas:

[
  {"string":"string1","int":1,"array":[1,2,3],"dict": {"key": "value1"}},
  {"string":"string2","int":2,"array":[2,4,6],"dict": {"key": "value2"}},
  {
    "string": "string3",
    "int": 3,
    "array": [
        3,
        6,
        9
    ],
    "dict": {
        "key": "value3",
        "extra_key": "extra_value3"
    }
  }
]

Para ler este objeto, habilite o modo de várias linhas:

SQL

CREATE TEMPORARY VIEW multiLineJsonTable
USING json
OPTIONS (path="/tmp/multi-line.json",multiline=true)

Scala

val mdf = spark.read.option("multiline", "true").format("json").load("/tmp/multi-line.json")
mdf.show(false)

Detecção automática de conjuntos 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:

spark.read.option("charset", "UTF-16BE").format("json").load("fileInUTF16.json")

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.

Exemplo de notebook: ler arquivos JSON

O notebook a seguir demonstra o modo de linha única e de várias linhas.

Ler notebook de arquivos JSON

Obter notebook