Опции записи

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