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格式读取事务存储,代码示例:
注意:该模式适合小数据量实时查询,吞吐量和性能不及OLAP模式。data = spark.read.format("cosmos.sql") .option("spark.synapse.linkedService", "CosmosDBLink") .option("spark.cosmos.container", "ContainerName") .load() - 手动过滤过期数据:必须使用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
相关产品推荐
相关产品推荐

