#databricks #azure-synapse
#блоки данных #azure-synapse
Вопрос:
Есть ли какой-либо способ объединить фрейм данных в таблицу Azure Synapse?? что я нашел для datarame.write.mode()
разрешить только добавление и перезапись… Есть ли какие-либо обходные пути?
Ответ №1:
Если вы имели в виду upsert: Synapse не поддерживает upsert
Вам нужно будет сделать свой собственный delete
, а затем insert
имитировать upsert.
Предполагается, что ваши новые данные являются полными (т. Е. Они содержат не только значения столбцов изменений, но и все значения столбцов). Если нет, то вам придется прочитать другой фрейм данных из Synapse, объединить их в Spark / Databricks, а затем выполнить upsert.
Вы также можете сделать это с помощью промежуточной таблицы в Synapse и использовать вычисления Synapse для выполнения upsert вместо вычисления Spark.
Если нет, то вам придется прочитать другой фрейм данных из Synapse, объединить их в Spark / Databricks, а затем выполнить upsert.
Для разработки:
Если у вас есть это в БД:
k,a,b
1,1,1
2,2,2
Это фрейм данных (скажем df_new
), который вы пытаетесь записать в БД:
k,a
1,11
3,3
И это то, как вы ожидаете, что БД будет выглядеть после обновления:
k,a,b
1,11,1
2,2,2
3,3,null
Затем вам нужно создать df_current_db
фрейм данных, который имеет:
k,a,b
1,1,1
ПРИМЕЧАНИЕ: вам нужны только ключи, которые существуют df_new
не во всех.
Затем объединить df_current_db
и df_new
создать новый df_upsert
, который имеет:
k,a,b
1,11,1
3,3,null
Наконец, вам нужно выполнить upsert:
delete from DB where k in (select k from df_upsert)
insert into DB (select * from df_upsert)
Комментарии:
1. «Если нет, то вам придется прочитать другой фрейм данных из Synapse, объединить их в Spark / Databricks, а затем выполнить upsert». << что значит?upsert внутри фрейма данных в databricks?
2. @mytabi обновлен для уточнения. HTH.
3. df_upsert нужно сначала вернуть в базу данных Synapse? прежде чем выполнять удаление и вставку? потому что я думаю, что удаление и вставка не могут напрямую обращаться к фрейму данных, который считывается из synapse….
4. последним шагом является ввод @mytabi
df_upsert
в базуinsert into DB (select * from df_upsert)
данных. И да, изменение фрейма данных не влияет на содержимое БД, если выwrite
не передаете фрейм данных в БД.