You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在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-shellpyspark,可以直接通过--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的最大行数,自动拆分到多个sheet
  • usePlainNumberFormat:避免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节点都安装pandasopenpyxl(或xlwt)库,适合有复杂格式需求的场景。

注意事项

  1. 版本兼容性:spark-excel的版本需要和你的Spark版本、Scala版本匹配,比如Scala 2.12对应Spark 3.x系列
  2. 大文件性能:对于TB级别的数据,优先选择spark-excel的分布式写入,避免单节点处理的瓶颈
  3. 权限问题:确保Spark集群有写入目标路径的权限,尤其是写入HDFS或云存储时

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

火山引擎 最新活动