PySpark的DataFrameLike与pandas.DataFrame差异及toPandas返回类型疑问
问题根因说明
- Spark将
toPandas()返回值定义为DataFrameLike而非直接绑定pandas.DataFrame,是为了做运行时兼容设计:DataFrameLike是一套通用协议类型,除了适配标准pandas DataFrame外,还可以兼容PySpark自带的pandas API on Spark DataFrame、cuDF等GPU加速类pandas框架的DataFrame实现,方便Spark在不同部署环境下切换后端实现时无需修改上层接口签名。 - mypy抛出属性不存在报错的直接原因是:DataFrameLike作为通用协议,仅定义了所有类pandas实现共同支持的最小公共方法集合,
to_csv这类标准pandas独有、或是不同实现存在参数差异的方法没有被纳入协议定义,静态类型检查时会判定该属性不属于DataFrameLike的成员。
常用规避方案
如果你确定当前运行环境下toPandas()返回的就是标准pandas DataFrame,可以通过两种方式消除mypy报错:
- 显式标注变量类型
import pandas as pd df: pd.DataFrame = spark_df.toPandas() df.to_csv(out_path, index=False)
- 用
typing.cast强制指定类型
from typing import cast import pandas as pd df = cast(pd.DataFrame, spark_df.toPandas()) df.to_csv(out_path, index=False)
内容的提问来源于stack exchange,提问作者Hari Seldon
相关产品推荐
相关产品推荐

