【问题标题】:Stop Spark from serializing null fields when writing to Cosmos在写入 Cosmos 时阻止 Spark 序列化空字段
【发布时间】:2022-11-10 14:26:39
【问题描述】:

我有一个可以覆盖 Cosmos 中文档的 spark notebook。其中一些文档具有在保存到 Cosmos 时未序列化的空字段,而其他文档则具有这些字段的数据。当我将数据帧写回 Cosmos 时,我最终会得到具有空字段的文档。

有没有办法不为该值为空的行序列化该列?

例子

Cosmos 中存在的文档:

{
    "id": "7b354753-e817-41f5-848d-780dab44d179",
    "pk": "20763ae4-8394-467d-ba3c-5ab363c40f90",
    "documentType": "ExampleDocument",        
    "userId": "20763ae4-8394-467d-ba3c-5ab363c40f90",
    "label": "Needs to be updated"
}

被覆盖后的文件:

{
    "id": "7b354753-e817-41f5-848d-780dab44d179",
    "pk": "20763ae4-8394-467d-ba3c-5ab363c40f90",
    "documentType": "ExampleDocument",        
    "userId": "20763ae4-8394-467d-ba3c-5ab363c40f90",
    "label": "Updated With Spark",                
    "details": null    
}

我仍然希望details 字段被序列化,但仅适用于它不为空的文档。

【问题讨论】:

    标签: azure pyspark azure-cosmosdb


    【解决方案1】:

    您可以在写入 cosmos db 时设置此配置:"spark.cosmos.serialization.inclusionMode" -> "NonNull" 以下链接:cosmos spark configuration

    请参阅下面的示例:

    val someDF = {dataFrameToWriteInComosDB}
    val CosmosDbContainerConfig = Map(
      "spark.cosmos.accountendpoint" -> {yourCosmosDbEndpoint},
      "spark.cosmos.accountkey" -> {yourMasterKey},
      "spark.cosmos.database" -> {yourDatabase},
      "spark.cosmos.container" -> {yourContainer},
      "spark.cosmos.serialization.inclusionMode" -> "NonNull",
      "spark.cosmos.write.strategy" -> "ItemOverwrite"
    ) ++ StandardThroughputControlConfig
    
    someDF.write.format("cosmos.oltp").options(CosmosDbContainerConfig).mode("append").save()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-07
      • 1970-01-01
      • 2017-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多