Как переписать / обновить коллекцию в Azure Cosmos DB от Databrick / PySpark - PullRequest
0 голосов
/ 02 февраля 2020

У меня есть следующий код PySpark, написанный на ноутбуке Databricks Notebook, который успешно сохраняет результаты от Spark SQL до Azure Cosmos DB со строкой кода:

df.write.format("com.microsoft.azure.cosmosdb.spark").mode("overwrite").options(**writeConfig3).save()

Полный код такой следующим образом:

test = spark.sql("""SELECT
  Sales.CustomerID AS pattersonID1
 ,Sales.InvoiceNumber AS myinvoicenr1
FROM Sales
limit 4""")


## my personal cosmos DB
writeConfig3 = {
    "Endpoint": "https://<cosmosdb-account>.documents.azure.com:443/",
    "Masterkey": "<key>==",
    "Database": "mydatabase",
    "Collection": "mycontainer",
    "Upsert": "true"
}

df = test.coalesce(1)

df.write.format("com.microsoft.azure.cosmosdb.spark").mode("overwrite").options(**writeConfig3).save()

Используя приведенный выше код, я успешно записал в свою базу данных Cosmos DB (mydatabase) и коллекцию (mycontainer) enter image description here

Когда я пытаюсь перезаписать контейнер, изменив Spark SQL следующим образом (просто изменив pattersonID1 на pattersonID2 и myinvoicenr1 на myinvoicenr2

test = spark.sql("""SELECT
  Sales.CustomerID AS pattersonID2
 ,Sales.InvoiceNumber AS myinvoicenr2
FROM Sales
limit 4""")

Вместо того, чтобы перезаписать / обновить коллекцию новым запросом, Cosmos DB добавляет контейнер как следует:

enter image description here

И по-прежнему оставляет исходный запрос в коллекции:

enter image description here

Есть ли способ полностью перезаписать или обновить базу данных космоса?

Ответы [ 2 ]

3 голосов
/ 02 февраля 2020

Ваша проблема в том, что документы имеют уникальный id (что-то, что вы никогда не указывали, и поэтому автоматически генерируется для вас как гид). Когда вы пишете новый документ, вы просто переименовываете одно из не id, неуникальных свойств, pattersonID1, в pattersonID2, и он просто создает новый документ, как и ожидалось. Нет никакого способа узнать, что этот новый документ связан с оригиналом, поскольку это совершенно новый документ с собственным набором свойств.

Вы можете обновить существующие документы, запросив их (или прочитав их) , изменяя их, а затем заменяя их. Или вы можете запросить старые документы и удалить их (один за другим или транзакционно в виде группы удалений в разделе с помощью хранимой процедуры). Наконец, вы можете удалить и заново создать контейнер, который удалит все документы, хранящиеся в нем.

1 голос
/ 02 февраля 2020

Вместо использования Spark to Cosmos DB Connector вы можете использовать API-интерфейс Azure Cosmos DB SQL API для Python для управления базами данных и JSON документами, которые они содержат в этой службе баз данных No SQL:

  • Создание баз данных Cosmos DB и изменение их настроек

  • Создание и изменение контейнеров для хранения коллекций JSON документов

  • Создание, чтение, обновление и удаление элементов (JSON документы) в ваших контейнерах

  • Запрос документов в вашей базе данных с использованием SQL -подобный синтаксис.

Azure Клиентская библиотека Cosmos DB SQL для Python

...