Опции записи
sorted_by
Указание сортировки по некоторому префиксу колонок:
df.write.sorted_by("uuid").yt("//sys/spark/examples/test_data")
unique_keys
Уникальность ключа в таблице:
df.write.sorted_by("uuid").unique_keys.yt("//sys/spark/examples/test_data")
optimize_for
Таблица может храниться в построчном (lookup) и поколоночном (scan) формате. Предпочитаемый выбирается в зависимости от задачи:
spark.write.optimize_for("scan").yt("//sys/spark/examples/test_data")
spark.write.optimize_for("lookup").yt("//sys/spark/examples/test_data")
Schema v3
Запись таблиц со схемой в формате type_v3 вместо type_v1. Настраивается в Spark конфигурации или опции записи.
Python example:
df.write.option("write_type_v3", "true")
security_tags
При пакетной записи в статические таблицы SPYT автоматически переносит объединение security_tags из статических входных таблиц запроса в YTsaurus. Это работает для записи через DataFrame API и Spark SQL, в том числе с кэшированными DataFrame, временными представлениями, соединениями и агрегациями. Стандартные расширения Spark для SPYT должны быть включены.
В режиме overwrite выходная таблица получает вычисленные теги. В режиме append эти теги добавляются к существующим тегам выходной таблицы. Такое поведение поддерживается при обычной и распределённой записи.
Чтобы переопределить вычисленные теги, передайте строку с YSON-списком:
df.write.option("security_tags", '["sensitive";"userdata";]').yt("//tmp/output")
Опция attr_security_tags — алиас. Если указаны обе опции, приоритет имеет security_tags. Явный пустой список "[]" отключает наследование для этой записи. В режиме append переопределение не удаляет существующие теги выходной таблицы.
Теги сохраняются вместе с метаданными входов, в том числе при кэшировании DataFrame. SPYT не может вычислить теги для данных, прочитанных внутри UDF, восстановленных после collect() или потерявших связь с исходными таблицами при преобразованиях через RDD. Для этих случаев задавайте теги явно. Автоматическое наследование не поддерживается для динамических таблиц и потоковых запросов.
Динамические таблицы
Для динамических таблиц необходимо явно указать дополнительную опцию inconsistent_dynamic_write со значением true, чтобы подтвердить, что вы согласны с отсутствием поддержки транзакционной записи в динамические таблицы.
Python example:
df.write.option("inconsistent_dynamic_write", "true")