Spark(Databricks)处理小型Excel文件,选Pandas还是PySpark性能更优?
Spark(Databricks)处理万行级小Excel的性能最优方案
核心结论
针对10000行以内的小型Excel文件,用Pandas在Driver节点完成全量转换操作、仅在必要时转Spark DataFrame的方案性能最优,原有的「Pandas读取后立即转Spark DF再做处理」的方式确实存在不必要的性能开销。
具体原因分析
- Spark作为分布式计算框架,天生为TB/PB级大规模数据集设计,任何Spark转换操作都需要经过DAG调度、任务拆分、Executor进程间通信等固定流程,哪怕数据量只有几KB,这套调度开销也不会减少。针对万行级别的小数据,调度开销往往是实际计算开销的几十到上百倍。
- 万行级别的Excel数据加载到Driver内存完全无压力,哪怕是Databricks最小规格的Driver节点,也能轻松支撑百万行级别的Pandas内存计算,所有操作都是单节点内存内运算,无额外调度开销,计算效率远高于Spark。
- 小数据量下
spark.createDataFrame(pandas_df)的转换开销极低,完全可以在需要用到分布式能力的时候再做转换,不会产生明显耗时。
适用场景与代码示例
场景1:仅处理当前小文件,后续无大规模数据复用需求(推荐方案)
所有转换逻辑直接用Pandas实现,仅在需要写入分布式表、关联其他大规模Spark数据集时再转Spark DF:
import pandas as pd # 读取Excel,/dbfs/路径可以直接访问Databricks文件存储 df = pd.read_excel("/dbfs/mnt/your_file_path/file.xlsx") # 全量转换操作直接用Pandas实现 df = df[df["sales"] > 0] df["profit_rate"] = df["profit"] / df["sales"] # 仅在必要时转换为Spark DF spark_df = spark.createDataFrame(df)
场景2:当前处理逻辑后续需要兼容大规模Excel文件
可以直接用Spark的Excel数据源读取文件,省略Pandas中转步骤,保证逻辑的统一性,万行级场景下性能差异在秒级,不会影响核心使用体验:
# 直接用Spark API读取Excel,依赖crealytics excel包(Databricks runtime默认预装) spark_df = spark.read.format("com.crealytics.spark.excel") \ .option("header", "true") \ .option("inferSchema", "true") \ .load("mnt/your_file_path/file.xlsx") # 所有转换用Spark API实现 spark_df = spark_df.filter(spark_df.sales > 0).withColumn("profit_rate", spark_df.profit / spark_df.sales)
性能参考
同一份10000行Excel文件在Databricks社区版的实测耗时:
- Pandas全量处理+按需转Spark DF:1~2秒
- Pandas读取后立即转Spark DF再处理:3~5秒
- 直接用Spark读取+处理:4~6秒
内容的提问来源于stack exchange,提问作者baatchen
相关产品推荐
相关产品推荐

