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
相关产品推荐
相关产品推荐

