Есть ли способ, чтобы Spark прочитал один раздел даты из таблицы Snowflake, обновил его, а затем перезаписал этот раздел с одной датой. Должна поддерживаться одновременная запись. В настоящее время в Spark есть два режима перезаписи, поэтому я не вижу способа перезаписать один раздел. В Iceberg это легко сделать, поскольку в режиме перезаписи перезаписывается только один раздел. Я упускаю какое-то очевидное решение?
Меня интересует решение, которое не требует транзакций или сложных SQL-запросов. В идеале то же поведение, что и в Iceberg, то есть операция, позволяющая перезаписать один раздел.
Спасибо за ответ. Я вижу, что у Снежинки есть кластеризация. Это может повысить производительность, если объем обновлений находится в пределах одного раздела. Я вижу, что Снежинке сложно сказать, что она должна перезаписывать микроразделы только по какому-то ключу кластеризации. Я вижу, что у Snowflake нет простого способа добиться поведения overwrite_partition, что, на мой взгляд, неудобно.
Привет! Похоже, вы не понимаете, как устроена архитектура Snowflake, и применяете к Snowflake методы, которые вы нашли полезными в другой СУБД, - хотя они не актуальны или не применимы. Микроразделы Snowflake доступны только для чтения, поэтому их нельзя перезаписать; в Snowflake ничего нельзя перезаписать. Когда вы «обновляете» что-то в Snowflake, вы фактически вставляете данные в новые микроразделы, а Snowflake помечает старую версию как устаревшую. Если у вас есть конкретная проблема с производительностью в Snowflake, возможно, обновите свой вопрос, и люди смогут вам помочь.
Спасибо за ваш комментарий. Я имею в виду, что я хочу, чтобы Spark создал кучу файлов с данными за «день», а Snowflake перезаписала свои старые файлы за этот день файлами, сгенерированными Spark. Микроразделы — это просто файлы/куча файлов + метаданные, если я правильно понял. Ничто не мешает ему создавать новые разделы на основе результатов Spark. В целом цель достижима, но не так просто, как, по крайней мере, в Iceberg, где не нужно писать «не Spark» код.
Snowflake не хранит данные в виде файлов (при условии, что вы используете стандартные таблицы), поэтому в этом случае ваш последний комментарий, особенно «Snowflake перезаписывает свои старые файлы», по-прежнему не имеет особого смысла.
Предполагая, что в ваших таблицах Snowflake есть столбец, указывающий «день», вы можете удалить эти записи и загрузить последние файлы Spark в Snowflake. Если ваш новый набор файлов представляет собой изменение данных в существующих записях в Snowflake, вы потенциально можете вставить/обновить/удалить их с помощью оператора слияния.
Если вы говорите о каком-то типе внешней таблицы Snowflake (которая находится над файлами, хранящимися в облачной системе хранения), то вы можете управлять этими файлами вне Snowflake и просто обновлять метаданные в Snowflake по мере необходимости.
Если вы просто пытаетесь переместить данные из Spark в Snowflake, я бы начал с прочтения этой части документации.
Помечено как принятый ответ. Я вижу, что для искрового писателя нет режима overwrite_partition
. Спасибо за ответ
В Snowflake нет разделов — по крайней мере, в том смысле, который, я думаю, вы имеете в виду, — поэтому ваш вопрос не имеет особого смысла. Это столбчатая база данных с микроразделами, которые доступны только для вставки. Если вы хотите обновить записи в таблице Snowflake, просто обновите их.