温馨提示:本文翻译自stackoverflow.com,查看原文请点击:其他 - How to overwrite/update a collection in Azure Cosmos DB from Databrick/PySpark
azure-cosmosdb azure-databricks pyspark pyspark-sql

其他 - 如何从Databrick / PySpark覆盖/更新Azure Cosmos DB中的集合

发布于 2020-04-12 12:04:42

我在Databricks Notebook上编写了以下PySpark代码,使用代码行将结果从sparkSQL成功保存到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) 在此处输入图片说明

当我尝试通过以下更改SparkSQL来覆盖容器时(只需将pattersonID1更改为pattersonID2,将myinvoicenr1更改为myinvoicenr2

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

而是使用新查询Cosmos DB覆盖/更新集合,将容器追加如下:

在此处输入图片说明

仍将原始查询保留在集合中:

在此处输入图片说明

有没有办法完全覆盖或更新cosmos DB?

查看更多

提问者
Carltonp
被浏览
33
David Makogon 2020-02-02 23:06

您的问题是文档具有唯一性id(您从未指定过的内容,因此会自动为您生成guid)。在编写新文档时,您刚刚将id非唯一性,非唯一属性重命名pattersonID1pattersonID2,并且它只是按预期的方式创建了一个新文档。无法知道这个新文档与原始文档有关,因为它是一个全新的文档,具有自己的属性集。

您可以通过查询(或阅读它们),修改它们然后替换它们来更新现有文档。或者,您可以选择查询旧文档并删除它们(一个或一个,或者通过存储过程以事务方式作为分区中的一批删除操作)。最后,您可以删除并重新创建一个容器,该容器将删除当前存储在其中的所有文档。