Databricks与Cosmos之间的UPSERT / INSERT / UPDATE

时间:2019-04-23 06:08:30

标签: azure-cosmosdb databricks azure-databricks azure-cosmosdb-sqlapi cosmos

当前,我们使用Azure Databricks作为转换层,并将转换后的数据通过连接器加载到Cosmos DB。

场景:

我们有2个文件作为源文件。

第一个文件包含名称,年龄

第二个文件包含名称,州,国家/地区

在Cosmos中,我使用ID(分区键)创建了收藏集<​​/ p>

在databricks中,我将这两个文件作为Dataframe加载,并创建一个临时表来查询内容。

我正在从第一个文件中查询内容[从文件中选择名称作为id,名称,年龄],并将其加载到Cosmos Collection中。

从第二个文件开始。我正在使用[选择名称作为ID,州,国家/地区]并加载到同一集合中,希望第二个文件中的内容基于ID字段插入同一文档的同一集合中。

这里的问题是,当我从第二个文件加载内容时,第一个文件中的属性“ age”被删除,并且在cosmos文档中仅看到id,名称,州,国家/地区。发生这种情况是因为我在数据块中使用UPSERT来加载到Cosmos。

当我将UPSERT更改为INSERT或UPDATE时,它会抛出错误,提示“具有ID的资源已存在”

Databricks与Cosmos的连接:

val configMap = Map(
  "Endpoint" -> {"https://"},
  "Masterkey" -> {""},
  "Database" -> {"ods"},
  "Collection" -> {"tval"},
  "preferredRegions" -> {"West US"},
  "upsert" -> {"true"}) 
  val config = com.microsoft.azure.cosmosdb.spark.config.Config(configMap)

有没有一种方法可以从第二个文件中插入属性,而不删除已经存在的属性。我不使用JOIN操作,因为用例不适合使用。

1 个答案:

答案 0 :(得分:0)

从模糊的记忆中,您需要在数据框上设置id属性以匹配两个数据集。 如果您忽略此字段,Cosmos将生成一条新记录-这就是您正在发生的事情。

因此,如果df1和df2在第一条记录上具有id = 1,则第一个将插入它,第二个将对其进行更新。

但是,如果它们是相同的记录,那么加入Spark将会更有效率。