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

Pandas on Spark中apply()疑似改变列结构问题求助

关于PySpark pandas中apply返回列多维度shape的解释

你遇到的核心现象:

  • 用ps.read_sql_query读取的数据总行数748834、列数84,loan_information.shape返回结果符合预期
  • 但调用loan_information.apply(lambda col: col.shape)时,每列返回由75个元素组成的结构,前74个为(10000,),最后一个为(8843,),总数求和虽正确,但和预期的单维度shape不符

原因解析

这是PySpark pandas(原项目名为Koalas)的分区存储特性导致的:

  • PySpark pandas底层依赖Spark分布式计算引擎,读取数据后会自动将数据拆分为多个分区存储(这里刚好拆分出75个分区:74*10000 + 8843 = 748834)
  • 对整个DataFrame调用apply处理列时,操作默认按分区执行——lambda里的col并不是全局整列,而是每个分区对应的列片段。所以返回的shape是各分区片段的shape集合,而非整列的全局shape

解决办法

如果需要获取整列的全局shape,有两种常用方式:

  • 直接针对单个列调用shape:比如loan_information['your_column'].shape,会直接返回整列的(748834,)
  • 若一定要用apply,需先将分区列转换为本地Pandas列(注意:大数据量下会把数据拉到Driver端,可能引发内存问题):
    loan_information.apply(lambda col: col.to_pandas().shape)
    

你猜测的“按10000条批次发送给执行器”是正确的,这就是Spark的分区拆分逻辑,PySpark pandas继承了这个特性,只是apply的列处理逻辑默认没有合并分区结果,才出现这种看似不符合预期的输出。

内容的提问来源于stack exchange,提问作者Cody Dance

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 11:02:11