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

Synapse PySpark执行count报Parquet解码异常故障排查

问题根因说明

ParquetDecodingException是Parquet文件读取阶段的解码错误,你调用count()才触发报错是Spark懒执行机制导致的——前面写的withColumn、explode_outer、select都属于转换算子,只记录执行计划不会实际读取存储数据,只有count()这类行动算子才会启动任务拉取数据执行计算,所以错误会在这一步暴露。

你代码中的逻辑bug是首要诱因

你的数组展开循环存在两处明显逻辑错误,会直接导致执行异常:

  • 每次循环计算完当前DataFrame剩余的array列后,新生成的列清单DataFrame命名为df_OroCommerce_array_col,但你后续转Pandas时调用的还是初始状态的X_array_col,根本没有获取更新后的列清单
  • 循环终止条件依赖的n_array永远等于初始DataFrame X中的array列数量,永远不会降到0,整个while循环是死循环

死循环会让Spark执行计划中反复叠加同一批列的explode、struct展开逻辑,执行计划深度爆炸后,Parquet读取时的Schema映射关系完全混乱,直接触发解码失败。
先把循环中错误的这行代码:

tab_toPd = X_array_col.toPandas()

修改为:

tab_toPd = df_OroCommerce_array_col.toPandas()

修复死循环问题后再重试任务。

修复代码后仍报错的话,是底层Parquet文件/读取配置问题

如果改完代码还是报相同错误,问题出在存储层的Parquet文件或者读取配置上,常见场景:

  • 目标Parquet数据集是多次写入生成的,不同分区、不同文件的同名字段类型不一致,比如某文件中array列元素为整型,另一文件中同名列array元素为字符串,Spark统一按固定Schema解码时就会失败
  • 报错日志里明确打印了异常文件的路径,该文件本身可能已经损坏,比如写入时任务异常中断、Blob存储传输过程中数据缺失,导致文件块内容不完整无法解码
  • Azure Synapse内置的Parquet向量化读取器对深层嵌套的array/struct类型存在兼容问题,可以添加以下配置关闭向量化读取、开启嵌套类型兼容后重试:
spark.conf.set("spark.sql.parquet.enableVectorizedReader", "false")
spark.conf.set("spark.sql.parquet.readLegacyNestedString", "true")

内容的提问来源于stack exchange,提问作者Quynh-Mai Chu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 13:00:15