W jaki sposób wariant różni się od ciągów JSON?

W tym artykule opisano zmiany zachowania oraz różnice w składni i semantyce podczas korzystania z typu danych Variant. W tym artykule założono, że wiesz już, jak pracować z danymi ciągu JSON w usłudze Azure Databricks. W przypadku użytkowników nowych w usłudze Azure Databricks należy używać wariantu dla ciągów JSON za każdym razem, gdy dane częściowo ustrukturyzowane wymagają elastyczności w zakresie zmiany lub nieznanego schematu. Zobacz Modelowanie częściowo ustrukturyzowanych danych.

W Databricks Runtime 15.3 i nowszych wersjach można używać typu danych variant do kodowania danych częściowo ustrukturyzowanych i wykonywania dotyczących ich zapytań. Databricks zaleca typ variant jako zamiennik przechowywania danych częściowo ustrukturyzowanych w postaci ciągów JSON. Lepsza wydajność odczytu i zapisu typu variant pozwala mu w niektórych zastosowaniach zastąpić natywne złożone typy Spark, takie jak struktury i tablice.

Jak wykonywać zapytania dotyczące danych wariantów?

Dane wariantu używają tych samych operatorów do wykonywania zapytań dotyczących pól, pól podrzędnych i elementów tablicy.

Aby wysłać zapytanie do pola, użyj polecenia :. Na przykład column_name:field_name.

Aby wysłać zapytanie do pola podrzędnego, użyj polecenia .. Na przykład column_name:field_name.subfield_name.

Aby odpytać element tablicy, użyj [n], gdzie n jest całkowitą wartością indeksu elementu. Aby na przykład wysłać zapytanie do pierwszej wartości w tablicy, column_name:array_name[0].

Następujące różnice mogą spowodować, że istniejące zapytania przestaną działać podczas aktualizacji z ciągów znaków JSON do typu variant:

  • Wszystkie elementy ścieżki wariantu są dopasowywane w sposób uwzględniający wielkość liter. Ciągi JSON nie rozróżniają wielkości liter. Oznacza to, że w przypadku wariantu column_name:FIELD_NAME i column_name:field_name szukają różnych pól w zapisanych danych.
  • Składnia [*] nie obsługuje identyfikowania ani rozpakowywania wszystkich elementów w tablicy.
  • Wariant koduje NULL wartości inaczej niż ciągi JSON. Zobacz Temat Variant null rules (Reguły wartości null wariantu).
  • Kolumny wariantów mają ograniczenia dotyczące niektórych operacji. Zobacz Ograniczenia.

Konwertowanie ciągów JSON na i z wariantu

W środowisku Databricks Runtime 15.3 i nowszych funkcja to_json oferuje dodatkową funkcjonalność rzutowania typów VARIANT na ciągi JSON. Opcje są ignorowane podczas konwertowania VARIANT na ciąg JSON. Zobacz to_json.

Funkcja parse_json (SQL lub Python) przekształca ciąg JSON na VARIANT typ. Chociaż parse_json(json_string_column) jest logiczną odwrotnością to_json(variant_column), poniższe reguły konwersji opisują, dlaczego nie jest jej dokładną odwrotnością:

  • Białe znaki nie są idealnie zachowane.
  • Kolejność kluczy jest dowolna.
  • Końcowe zera w liczbach mogą być pomijane.

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()

Funkcja parse_json zwraca błąd, jeśli ciąg JSON jest źle sformułowany, przekracza limit rozmiaru wariantu lub jest nieprawidłowy. Użyj funkcji try_parse_json (SQL lub Python), aby zwrócić NULL w przypadku wystąpienia błędu podczas analizowania.

SQL

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

Python

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

Jakie są funkcje SQL do pracy z wariantami?

Funkcje apache Spark SQL dostępne w środowisku Databricks Runtime 15.3 lub nowszym udostępniają metody interakcji z danymi wariantów. Poniższa tabela zawiera nową funkcję, odpowiednią funkcję ciągu JSON i uwagi dotyczące różnic w zachowaniu.

Warianty inaczej obsługują rzutowanie i NULLs niż ciągi JSON. Zobacz reguły rzutowania typów Variant i reguły null dla typu Variant.

Uwaga

Aby używać tych funkcji z ramkami danych PySpark, zaimportuj je z pyspark.sql.functions.

Funkcja wariantowa Funkcja ciągu JSON Uwagi
variant_get cast oraz get_json_object Przyjmuje wyrażenie, ścieżkę i typ. Przestrzega wszystkich zasad dotyczących ścieżek wariantów, rzutów i wartości null.
try_variant_get try_cast i get_json_object Przyjmuje wyrażenie, ścieżkę i typ. Przestrzega wszystkich zasad dotyczących ścieżek wariantów, rzutów i wartości null.
is_variant_null ma wartość null Sprawdza, czy wyrażenie przechowuje zakodowany element VARIANTNULL. Użyj is null, aby sprawdzić, czy wyrażenie wejściowe to NULL.
schema_of_variant schema_of_json Podczas określania schematu dla ARRAY<elementType>, elementType może być wywnioskowany jako VARIANT, jeśli w danych wystąpią konflikty typów.
schema_of_variant_agg schema_of_json_agg Jeśli nie zostanie zidentyfikowany najmniej wspólny typ, typ jest określany jako VARIANT.
variant_explode eksplodować Wyświetla kolumny pos, key i value. Podczas eksplodowania tablicy klucz wyjściowy zawsze ma wartość null.
variant_explode_outer explode_outer Wyświetla kolumny pos, key i value. Podczas eksplodowania tablicy klucz wyjściowy zawsze ma wartość null.