Jak se varianta liší od řetězců JSON?

Důležité

Tato funkce je ve verzi Public Preview.

Tento článek popisuje změny chování a rozdíly v syntaxi a sémantice při práci s datovým typem varianty. Tento článek předpokládá, že znáte práci s řetězcovými daty JSON v Azure Databricks. Pro uživatele, kteří s Azure Databricks začínají, byste měli používat variantu místo řetězců JSON, jakmile ukládáte částečně strukturovaná data, která vyžadují flexibilitu, když se schéma mění nebo je neznámé. Viz Částečně strukturovaná data modelu.

Ve službě Databricks Runtime 15.3 a vyšší můžete k kódování a dotazování částečně strukturovaných dat použít datový typ varianty. Databricks doporučuje variantu jako náhradu za ukládání částečně strukturovaných dat pomocí řetězců JSON. Vylepšený výkon čtení a zápisu pro variantu umožňuje nahradit nativní komplexní typy Sparku, jako jsou struktury a pole v některých případech použití.

Jak se dotazujete na variantní data?

Data variant používají stejné operátory k dotazování polí, dílčích polí a prvků pole.

K dotazování na pole použijte :. Například column_name:field_name.

Pokud chcete zadat dotaz na dílčí pole, použijte .. Například column_name:field_name.subfield_name.

Chcete-li dotazovat prvek pole, použijte [n], kde n je celočíselná hodnota indexu prvku. Pokud chcete například zadat dotaz na první hodnotu v poli, column_name:array_name[0].

Následující rozdíly můžou při upgradu z řetězců JSON na variantu přerušit stávající dotazy:

  • Všechny prvky cesty varianty se porovnávají s rozlišením velkých a malých písmen. Řetězce JSON nerozlišují malá a velká písmena. To znamená, že u varianty column_name:FIELD_NAME a column_name:field_name hledají v uložených datech různá pole.
  • Syntaxe [*] nepodporuje identifikaci ani rozbalení všech prvků v poli.
  • Varianta kóduje hodnoty NULL odlišně než řetězce JSON. Viz pravidla pro null varianty.
  • U některých operací mají sloupce variant omezení. Viz Omezení.

Převod řetězců JSON na variantu a z varianty

V Databricks Runtime 15.3 a novějších verzích má funkce to_json další možnosti pro převod typů VARIANT na řetězce JSON. Možnosti jsou při převodu VARIANT na řetězec JSON ignorovány. Viz to_json.

Funkce parse_json (SQL nebo Python) transformuje řetězec JSON na VARIANT typ. Zatímco parse_json(json_string_column) je logická inverzní funkce to_json(variant_column), následující pravidla převodu popisují, proč to není přesná inverzní funkce:

  • Prázdné znaky nejsou dokonale zachovány.
  • Řazení klíčů je libovolné.
  • Koncové nuly v číslech mohou být zkráceny.

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

Funkce parse_json vrátí chybu, pokud je řetězec JSON poškozený, překročí limit velikosti varianty nebo je neplatný. Použijte funkci try_parse_json (SQL nebo Python) k vrácení NULL, pokud dojde k chybě při analýze.

SQL

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

Python

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

Jaké jsou funkce SQL pro práci s variantami?

Funkce Apache Spark SQL dostupné ve službě Databricks Runtime 15.3 a vyšší poskytují metody pro interakci s variantovými daty. Následující tabulka obsahuje novou funkci, odpovídající řetězcovou funkci JSON a poznámky k rozdílům v chování.

Varianty zpracovávají přetypování a NULLs odlišným způsobem než řetězce JSON. Viz pravidla přetypování pro typ Variant a pravidla pro hodnotu null typu Variant.

Poznámka:

Pokud chcete tyto funkce použít s datovými rámci PySpark, naimportujte je z pyspark.sql.functions.

Variantní funkce Funkce řetězce JSON Poznámky
variant_get cast a get_json_object Přebírá výraz, cestu a typ. Dodržuje všechna pravidla pro cesty variant, přetypování a hodnoty null.
try_variant_get try_cast a get_json_object Přebírá výraz, cestu a typ. Dodržuje všechna pravidla pro cesty variant, přetypování a hodnoty null.
is_variant_null má hodnotu null. Zkontroluje, zda výraz ukládá VARIANT kódovaný NULL. Pomocí is null zkontrolujete, zda je vstupní výraz NULL.
schema_of_variant schema_of_json Při určování schématu pro ARRAY<elementType>může být elementType odvozeno jako VARIANT, pokud jsou v datech nalezeny konfliktní typy.
schema_of_variant_agg schema_of_json_agg Pokud není identifikován nejmenší společný typ, je typ odvozen jako VARIANT.
variant_explode explodovat Výstupy sloupce pos, keya value. Při rozbalení pole je klíč výstupu vždy null.
variant_explode_outer explode_outer Výstupy sloupce pos, keya value. Při rozbalení pole je výstupní klíč vždy null.