You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pyspark如何从变量存储的xlsx字节数据创建Spark DataFrame

可行实现方案

有两种成熟的落地方案,可根据文件大小、依赖环境选择:

方案1:Pandas中转(小文件首选,实现最简)

适合单节点可承载的中小体积xlsx文件,不需要修改Spark配置,代码量最少:

依赖要求

提前安装pandas、openpyxl库,用于解析内存中的xlsx字节。

实现代码

import requests
import pandas as pd
from io import BytesIO

# 原有登录、下载逻辑不变
s = requests.Session()
r = s.request(
    method = 'POST', 
    url = "你的目标网站地址",
    data = {
        'email': "你的登录邮箱",
        'password': "你的登录密码"
        }
 )
file = s.get(file_url)

# 核心内存读取逻辑
# 将二进制字节包装为文件对象
excel_buf = BytesIO(file.content)
# 直接读取内存中的xlsx为pandas DataFrame
pandas_df = pd.read_excel(excel_buf, sheet_name="Sheet1", header=0)
# 转换为Spark DataFrame
spark_df = sparkSession.createDataFrame(pandas_df)

方案2:Crealytics原生读取(大文件首选,分布式性能好)

适合大体积xlsx文件,完全基于Spark分布式能力处理,不需要依赖本地Python库,无单节点内存瓶颈:

依赖要求

com.crealytics:spark-excel版本≥0.14.0,该版本开始内置binaryColumn参数支持直接读取二进制列。

实现代码

import requests

# 原有登录、下载逻辑不变
s = requests.Session()
r = s.request(
    method = 'POST', 
    url = "你的目标网站地址",
    data = {
        'email': "你的登录邮箱",
        'password': "你的登录密码"
        }
 )
file = s.get(file_url)

# 核心内存读取逻辑
# 将xlsx字节转为Spark二进制数据集
bytes_rdd = sparkSession.sparkContext.parallelize([file.content])
bytes_df = bytes_rdd.map(lambda x: (x,)).toDF(["excel_bytes"])

# 直接通过crealytics读取内存中的二进制数据
spark_df = sparkSession.read.format("com.crealytics.spark.excel")\
    .option("dataAddress", "'Sheet1'!")\
    .option("header", "true")\
    .option("binaryColumn", "excel_bytes")\
    .load(bytes_df)
注意事项
  • 如果spark-excel版本低于0.14.0没有binaryColumn参数,直接使用方案1即可
  • 两种方案均不需要写入磁盘,完全在内存中完成数据解析转换

内容的提问来源于stack exchange,提问作者André Luiz Tiago Soares

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 04:06:04