Como a variante é diferente das cadeias de caracteres JSON?

Importante

Esse recurso está em uma versão prévia.

Este artigo descreve as alterações de comportamento e as diferenças na sintaxe e semântica ao trabalhar com o tipo de dados variante. Este artigo pressupõe que você esteja familiarizado com o trabalho com dados de cadeia de caracteres JSON no Azure Databricks. Para usuários que estão começando a usar o Azure Databricks, você deve usar o tipo variant em vez de strings JSON sempre que armazenar dados semiestruturados que exijam flexibilidade devido a um esquema mutável ou desconhecido. Consulte dados semiestruturados do Modelo.

No Databricks Runtime 15.3 e superior, você pode usar o tipo de dados variante para codificar e consultar dados semiestruturados. O Databricks recomenda a variante como uma substituição para armazenar dados semiestruturados usando cadeias de caracteres JSON. O desempenho aprimorado de leitura e escrita do tipo variant permite que ele substitua tipos complexos nativos do Spark, como structs e arrays, em alguns casos de uso.

Como consultar dados variantes?

Os dados variantes usam os mesmos operadores para consultar campos, subcampos e elementos de matriz.

Para consultar um campo, use :. Por exemplo, column_name:field_name.

Para consultar um subcampo, use .. Por exemplo, column_name:field_name.subfield_name.

Para consultar um elemento de matriz, use [n] onde n é o valor de índice inteiro do elemento. Por exemplo, para consultar o primeiro valor em uma matriz, column_name:array_name[0].

As seguintes diferenças podem interromper as consultas existentes ao atualizar de cadeias de caracteres JSON para variante:

  • Todos os elementos do caminho da variante são comparados de forma sensível a maiúsculas e minúsculas. As cadeias de caracteres JSON não diferenciam maiúsculas de minúsculas. Isso significa que, para variante, column_name:FIELD_NAME e column_name:field_name procuram campos diferentes nos dados armazenados.
  • A sintaxe [*] não é compatível para identificar ou desempacotar todos os elementos em uma matriz.
  • A variante codifica valores NULL de forma diferente das cadeias de caracteres JSON. Consulte regras nulas de variante.
  • As colunas do tipo variant têm limitações em algumas operações. Confira Limitações.

Converter cadeias de caracteres JSON de e para variante

No Databricks Runtime 15.3 e posteriores, a função to_json tem funcionalidade adicional para converter tipos VARIANT em cadeias de caracteres JSON. As opções são ignoradas ao converter VARIANT em cadeia de caracteres JSON. Veja to_json.

A função parse_json (SQL ou Python) transforma uma string JSON para o tipo VARIANT. Embora parse_json(json_string_column) seja o inverso lógico de to_json(variant_column), as seguintes regras de conversão descrevem por que não é o inverso exato:

  • O espaço em branco não é perfeitamente preservado.
  • A ordenação de chaves é arbitrária.
  • Zeros à direita de números podem ser truncados.

SQL

SELECT parse_json('{"key": 1, "data": [2, 3, "str"]}');

Python

spark.range(1).select(parse_json(lit('{"key": 1, "data": [2, 3, "str"]}'))).display()

A parse_json função retornará um erro se a cadeia de caracteres JSON estiver malformada, exceder o limite de tamanho de variante ou for inválida. Use a try_parse_json função (SQL ou Python) para, em vez disso, retornar um NULL quando ocorrer um erro na análise.

SQL

SELECT try_parse_json('{"a" : invalid, "b" : 2}');

Python

spark.range(1).select(try_parse_json(lit('{"a" : invalid, "b" : 2}'))).display()

Quais são as funções SQL para trabalhar com variantes?

As funções SQL do Apache Spark disponíveis no Databricks Runtime 15.3 e superior fornecem métodos para interagir com dados variantes. A tabela a seguir inclui a nova função, a função de cadeia de caracteres JSON correspondente e anotações sobre as diferenças de comportamento.

As variantes lidam com a conversão e NULLs de forma diferente das cadeias de caracteres JSON. Consulte regras de conversão de tipo variante e regras nulas variante.

Observação

Para usar essas funções com DataFrames do PySpark, importe-as de pyspark.sql.functions.

Função Variant Função de cadeia de caracteres JSON Observações
variant_get cast e get_json_object Usa uma expressão, um caminho e um tipo. Segue todas as regras para caminhos de variantes, conversão e nulos.
try_variant_get try_cast e get_json_object Usa uma expressão, um caminho e um tipo. Segue todas as regras para caminhos de variantes, conversão e nulos.
is_variant_null é null Verifica se a expressão está armazenando um VARIANT codificado como NULL. Use is null para verificar se a expressão de entrada é NULL.
schema_of_variant schema_of_json Ao determinar o esquema de um ARRAY<elementType>, o elementType pode ser inferido como VARIANT se houvesse tipos conflitantes encontrados nos dados.
schema_of_variant_agg schema_of_json_agg Quando nenhum tipo menos comum é identificado, o tipo é derivado como VARIANT.
variant_explode explodir Gera as colunas pos, key e value. Ao explodir uma matriz, a chave de saída é sempre nula.
variant_explode_outer explode_outer Gera as colunas pos, key e value. Ao explodir uma matriz, a chave de saída é sempre nula.