Чем вариант отличается от строк JSON?

В этой статье описываются изменения поведения и различия в синтаксисе и семантике при работе с типом данных variant. В этой статье предполагается, что вы знакомы с данными строки JSON в Azure Databricks. Для пользователей, которые новички в Azure Databricks, рекомендуется использовать альтернативу вместо строк JSON при хранении полуструктурированных данных, для которых требуется гибкость из-за изменяющейся или неизвестной схемы. См. Моделирование полуструктурированных данных.

В Databricks Runtime 15.3 и более поздних версиях можно использовать тип данных variant для кодирования и запроса полуструктурированных данных. Databricks рекомендует вариант в качестве замены для хранения полуструктурированных данных с помощью строк JSON. Улучшенная производительность чтения и записи для variant позволяет заменить собственные сложные типы Spark, такие как структуры и массивы в некоторых случаях использования.

Как запрашивать вариантные данные?

Вариантные данные используют те же операторы для запроса полей, подфилдов и элементов массива.

Чтобы запросить поле, используйте :. Например, column_name:field_name.

Чтобы запросить подфилд, используйте .. Например, column_name:field_name.subfield_name.

Чтобы запросить элемент массива, используйте [n], где n — это значение целочисленного индекса элемента. Например, чтобы запросить первое значение в массиве, column_name:array_name[0].

Следующие различия могут нарушить существующие запросы при обновлении строк JSON до варианта:

  • Все элементы пути варианта сопоставляются с учетом регистра. Строки JSON не учитывают регистр. Это означает, что для варианта column_name:FIELD_NAME и column_name:field_name ищут разные поля в хранимых данных.
  • Синтаксис [*] не поддерживает идентификацию или распаковку всех элементов в массиве.
  • Variant кодирует NULL значения, отличные от строк JSON. См. правила null-варианта.
  • Столбцы типа Variant имеют ограничения для некоторых операций. См. ограничения.

Преобразовать строки JSON в тип Variant и обратно

В Databricks Runtime 15.3 и более поздних версиях функция to_json поддерживает дополнительную возможность преобразования типов VARIANT в строки JSON. Параметры игнорируются при преобразовании VARIANT в строку JSON. См. to_json.

Функция parse_json (SQL или Python) преобразует строку JSON в VARIANT тип. Хотя parse_json(json_string_column) это логическая обратная часть to_json(variant_column), следующие правила преобразования описывают, почему это не точное обратное:

  • Пробелы сохраняются не полностью.
  • Порядок ключей является произвольным.
  • Конечные нули чисел могут быть усечены.

SQL

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

Питон

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

Функция parse_json возвращает ошибку, если строка JSON неправильно сформирована, превышает предел размера варианта или является недопустимым. Используйте функцию try_parse_json (SQL или Python), чтобы вернуть NULL при ошибке синтаксического анализа.

SQL

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

Питон

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

Что такое функции SQL для работы с вариантами?

Функции Apache Spark SQL, доступные в Databricks Runtime 15.3 и выше, предоставляют методы взаимодействия с вариантными данными. В следующей таблице приведена новая функция, соответствующая строковая функция JSON и заметки о различиях в поведении.

Варианты обрабатывают приведение и NULLs иначе, чем строки JSON. См. правила приведения типов Variant и правила null для Variant.

Примечание.

Чтобы использовать эти функции с DataFrame PySpark, импортируйте их из pyspark.sql.functions.

Вариантная функция Функция строки JSON Примечания.
variant_get cast и get_json_object Принимает выражение, путь и тип. Выполняет все правила для путей вариантов, приведения и значений NULL.
try_variant_get try_cast и get_json_object Принимает выражение, путь и тип. Выполняет все правила для путей вариантов, приведения и значений NULL.
is_variant_null имеет значение NULL Проверяет, хранит ли выражение объект VARIANT, закодированный с помощью NULL. Используется is null для проверки наличия входного выражения NULL.
schema_of_variant schema_of_json При определении схемы для объекта ARRAY<elementType>, elementType может быть выведено как VARIANT, если в данных есть конфликтующие типы.
schema_of_variant_agg schema_of_json_agg Если наименьший общий тип не определен, тип выводится как VARIANT.
variant_explode взорваться Выходные данные столбцы pos, key и value. При взрыве массива выходной ключ всегда имеет значение NULL.
variant_explode_outer explode_outer Выходные данные столбцы pos, key и value. При взрыве массива выходной ключ всегда имеет значение NULL.