Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этой статье описываются изменения поведения и различия в синтаксисе и семантике при работе с типом данных 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. |