Блоки данных: объединить фрейм данных в таблицу синапсов Azure

#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 не передаете фрейм данных в БД.