首页 > 解决方案 > Spark Cosmos db 连接器正在删除大多数行为空的列

问题描述

我正在尝试使用以下代码使用 spark cosmos 连接器从 cosmos db 读取 30K 行数据

val readConfig = Config(Map(
  "Endpoint" -> "",
  "Masterkey" -> "",
  "Database" -> "",
  "Collection" -> "",
  "PreferredRegions" -> "",
   "query_custom" -> """SELECT t.id,t.gender,t.loc from Tab t"""
 ))

val df = spark.read.cosmosDB(readConfig)

在 30k 中,只有 2 行的 ' loc ' 列具有非空值。但由于某种原因,连接器在最终数据帧中完全删除了“ loc ”列,最终数据帧给出了以下模式

df.printSchema
root
 |-- id: string (nullable = true)
 |-- gender: string (nullable = true)

有人可以帮我如何将“ loc ”列包含在我的最终数据框中。

标签: azureapache-sparkazure-cosmosdbazure-databricks

解决方案


当读取时不指定 schema 时,Spark Connector 需要对其进行推断。为了推断它,它对文档进行采样并基于它们创建模式。

问题可能是采样的文档没有这个属性(你说30K上只有2个有),所以生成schema读取完整数据时,显然没有。

直接在读取调用上提供模式将解决此问题。或者,您可以自定义采样大小(参考https://github.com/Azure/azure-cosmosdb-spark/blob/19561f0d42eaa91f9e4793fbdf30b62b22829868/src/main/scala/com/microsoft/azure/cosmosdb/spark/config/CosmosDBConfig。 scala#L47 , 默认 1000) 通过增加schema_samplesize.


推荐阅读