使用PySpark Pandas读取含空格文件路径报错的解决咨询
解决PySpark Pandas读取含空格的ABFSS路径Excel文件报错问题
问题重现
尝试读取包含空格的ABFSS路径Excel文件:
abfss://myaccount@myorganisation.dfs.core.windows.net/perils_database/Bushfire AUSTRALIA - PERILS Industry Exposure Database 2023.xlsx
使用以下代码:
import pyspark.pandas as ps input_file = "abfss://myaccount@myorganisation.dfs.core.windows.net/perils_database/Bushfire AUSTRALIA - PERILS Industry Exposure Database 2023.xlsx" ps.read_excel(input_file)
触发错误:
IllegalArgumentException: Illegal character in path at index 97: abfss://myaccount@myorganisation.dfs.core.windows.net/perils_database/Bushfire AUSTRALIA - PERILS Industry Exposure Database 2023.xlsx
解决方案
方案1:对路径中的空格进行URL编码
将路径里的空格替换为URL编码字符%20,可手动替换或用urllib.parse.quote自动处理:
import pyspark.pandas as ps from urllib.parse import quote input_file = "abfss://myaccount@myorganisation.dfs.core.windows.net/perils_database/Bushfire AUSTRALIA - PERILS Industry Exposure Database 2023.xlsx" # 拆分路径,仅对主机后的部分编码 base, path_part = input_file.split('net/', 1) encoded_path = quote(path_part) encoded_input_file = f"{base}net/{encoded_path}" ps_df = ps.read_excel(encoded_input_file)
方案2:借助Spark原生API读取后转换为PySpark Pandas DataFrame
Spark原生的文件读取对含空格的路径支持更友好,先通过Spark读取Excel,再转换为PySpark Pandas格式:
from pyspark.sql import SparkSession import pyspark.pandas as ps # 初始化SparkSession(若未初始化) spark = SparkSession.builder.appName("ReadExcel").getOrCreate() input_file = "abfss://myaccount@myorganisation.dfs.core.windows.net/perils_database/Bushfire AUSTRALIA - PERILS Industry Exposure Database 2023.xlsx" # 读取Excel,需确保已加载spark-excel依赖 spark_df = spark.read.format("com.crealytics.spark.excel") \ .option("header", "true") # 根据实际情况设置是否有表头 .load(input_file) # 转换为PySpark Pandas DataFrame ps_df = spark_df.to_pandas_on_spark()
注意:使用此方案需确保Spark环境已安装
spark-excel依赖,启动Spark时可通过参数指定:--packages com.crealytics:spark-excel_2.12:0.18.5(版本需与Spark版本匹配)。
原因说明
PySpark Pandas的read_excel方法在处理ABFSS路径时,未自动对空格进行URL转义,导致空格被识别为非法字符。通过URL编码或借助Spark原生读取能力,可规避该问题。
内容的提问来源于stack exchange,提问作者TheRealJimShady
相关产品推荐
相关产品推荐

