You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Azure Synapse PySpark作业仍读取到CosmosDB已删除记录问题

问题:TTL删除CosmosDB记录后,Synapse PySpark仍读取到已删除数据

我们通过设置TTL删除了CosmosDB容器中的所有记录,Azure门户数据资源管理器中已无法查看这些记录,但使用Azure Synapse工作区的PySpark脚本(通过链接服务访问)读取时,仍能获取到这些已删除的记录,预期PySpark查询不应返回这类数据。

使用的Spark读取代码如下:

data = spark.read.format("cosmos.olap")
.option("spark.synapse.linkedService", "CosmosDBLink")
.option("spark.cosmos.container", "ContainerName")
.load()

原因分析

  • OLAP模式依赖分析存储异步同步:cosmos.olap读取的是Cosmos DB的分析存储(Analytical Store),而TTL删除操作首先在**事务存储(Transactional Store)**生效(门户数据资源管理器访问的是事务存储),分析存储与事务存储的同步是异步进行的,存在延迟。
  • 分析存储TTL清理有周期:分析存储对过期数据的清理不是实时触发,而是按固定后台周期执行,周期时长受Cosmos DB配置和负载影响,通常在几小时到1天不等。

解决办法

  • 等待自动同步完成:如果业务允许,等待24小时内的后台清理周期完成,分析存储会自动移除过期数据,后续PySpark查询将不再返回已删除记录。
  • 手动触发分析存储同步:通过Azure CLI修改容器的分析存储TTL(设置为当前值即可),强制触发同步逻辑:
    az cosmosdb sql container update --account-name <你的CosmosDB账户名> --resource-group <资源组名> --database-name <数据库名> --name <容器名> --analytical-storage-ttl <当前TTL值>
    
  • 切换到事务存储读取:若需实时获取最新数据,改用cosmos.sql格式读取事务存储,代码示例:
    data = spark.read.format("cosmos.sql")
    .option("spark.synapse.linkedService", "CosmosDBLink")
    .option("spark.cosmos.container", "ContainerName")
    .load()
    
    注意:该模式适合小数据量实时查询,吞吐量和性能不及OLAP模式。
  • 手动过滤过期数据:必须使用OLAP模式时,可通过数据中的时间字段过滤过期记录:
    from pyspark.sql.functions import current_timestamp, col
    
    # 利用CosmosDB自动生成的_ts(创建时间戳,秒级)+ TTL计算过期时间,过滤未过期记录
    data = spark.read.format("cosmos.olap")
    .option("spark.synapse.linkedService", "CosmosDBLink")
    .option("spark.cosmos.container", "ContainerName")
    .load()
    .filter(col("_ts") + col("ttl") > current_timestamp().cast("long"))
    

内容的提问来源于stack exchange,提问作者Mohammad Atavur

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 14:07:16