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
相关产品推荐
相关产品推荐

