如何在Databricks中直接将Spark DataFrame写入XLS/XLSX格式?
直接将Spark DataFrame写入XLS/XLSX的可行方案
当然有办法直接基于Spark DataFrame完成XLS/XLSX格式的写入操作,不用必须转换成Pandas DataFrame。下面是几个经过验证的实用方案:
方案1:使用spark-excel第三方库(最推荐)
这是专门为Spark设计的Excel读写库,支持分布式读写,完全适配Spark的DataFrame API,不需要将数据拉到单节点处理。
第一步:添加依赖
根据你的Spark版本,在项目中引入对应的依赖:
- Spark 3.x版本的Maven坐标:
<dependency> <groupId>com.crealytics</groupId> <artifactId>spark-excel_2.12</artifactId> <version>0.13.7</version> </dependency>
- 如果是用
spark-shell或pyspark,可以直接通过--packages参数引入:
pyspark --packages com.crealytics:spark-excel_2.12:0.13.7
第二步:写入代码示例
Scala版本:
import org.apache.spark.sql.SaveMode val df = spark.read.csv("path/to/your/data.csv") // 写入单个sheet df.write .format("com.crealytics.spark.excel") .option("header", "true") // 是否写入表头 .option("dataAddress", "'Sheet1'!A1") // 指定写入的sheet和起始位置 .mode(SaveMode.Overwrite) .save("path/to/output/file.xlsx")
Python版本:
from pyspark.sql import SparkSession spark = SparkSession.builder.appName("ExcelWriter").getOrCreate() df = spark.read.csv("path/to/your/data.csv", header=True) # 写入Excel df.write \ .format("com.crealytics.spark.excel") \ .option("header", "true") \ .option("dataAddress", "'Sheet1'!A1") \ .mode("overwrite") \ .save("path/to/output/file.xlsx")
实用参数补充
sheetName:直接指定要写入的sheet名称(和dataAddress二选一即可)maxRowsPerSheet:如果数据量很大,可以设置每个sheet的最大行数,自动拆分到多个sheetusePlainNumberFormat:避免Excel将数字自动转为科学计数法
方案2:分区级结合Pandas写入(适合复杂格式需求)
如果需要自定义Excel的格式(比如单元格样式、合并单元格),可以利用Spark的mapPartitions API,在每个分区内用Pandas写入Excel文件,最后再合并这些小文件。这种方式依然是分布式处理,不会把全量数据拉到Driver节点:
Python示例:
import pandas as pd import uuid from pyspark.sql import SparkSession def write_partition_to_excel(partition): # 将分区数据转为Pandas DataFrame pdf = pd.DataFrame(partition, columns=["col1", "col2", "col3"]) # 写入当前分区的临时Excel文件 pdf.to_excel(f"/tmp/partition_{uuid.uuid4()}.xlsx", index=False) return [1] spark = SparkSession.builder.appName("PartitionExcelWriter").getOrCreate() df = spark.read.parquet("path/to/large/data.parquet") # 对每个分区执行写入操作 df.rdd.mapPartitions(write_partition_to_excel).count() # 最后可以用Pandas或其他工具合并所有临时Excel文件到一个文件中
注意:这种方式需要每个Executor节点都安装pandas和openpyxl(或xlwt)库,适合有复杂格式需求的场景。
注意事项
- 版本兼容性:
spark-excel的版本需要和你的Spark版本、Scala版本匹配,比如Scala 2.12对应Spark 3.x系列 - 大文件性能:对于TB级别的数据,优先选择
spark-excel的分布式写入,避免单节点处理的瓶颈 - 权限问题:确保Spark集群有写入目标路径的权限,尤其是写入HDFS或云存储时
内容的提问来源于stack exchange,提问作者mytabi




