PySpark批量读取Parquet生成DataFrame遇URISyntaxException报错求助
问题原因与解决方法
错误根源
报错的核心原因是路径字符串包含多余双引号,还存在一处协议格式错误:
list_files里的每个路径被错误包裹了双引号(比如'"s3://x/y/..."'),Spark解析路径时会把引号当作路径的一部分,触发URI语法错误。- 其中一条路径的S3协议写成了
s3:/,正确格式应为s3://,缺少的斜杠也会导致解析失败。
修正步骤
1. 修复路径列表
去掉路径两端的双引号,并修正协议格式:
list_year = ['yt_2021', 'yt_2020'] list_files = [ 's3://x/y/nyc_taxi/yellow_taxi/yellow_tripdata_2021-*', 's3://x/y/nyc_taxi/yellow_tripdata_2020-*' ]
2. 优化批量读取函数
原函数直接修改字符串列表的方式不够直观,建议用字典存储年份名称与对应DataFrame的映射,方便后续调用:
def read_parquet_multiple(list_year, list_files): df_map = {} # 用zip同时遍历名称和路径,代码更简洁 for df_name, file_path in zip(list_year, list_files): df_map[df_name] = spark.read.parquet(file_path) return df_map # 调用函数获取所有DataFrame taxi_dfs = read_parquet_multiple(list_year, list_files) # 按需访问具体年份的DataFrame yt_2021 = taxi_dfs['yt_2021'] yt_2020 = taxi_dfs['yt_2020']
备选实现(保留列表模式)
如果坚持用列表存储结果,可以初始化空列表后追加DataFrame,示例如下:
# 初始化空列表用于存储DataFrame year_dfs = [] list_files = [ 's3://x/y/nyc_taxi/yellow_taxi/yellow_tripdata_2021-*', 's3://x/y/nyc_taxi/yellow_tripdata_2020-*' ] def read_parquet_multiple(df_list, file_paths): for path in file_paths: df_list.append(spark.read.parquet(path)) read_parquet_multiple(year_dfs, list_files) # 通过索引访问DataFrame yt_2021 = year_dfs[0] yt_2020 = year_dfs[1]
内容的提问来源于stack exchange,提问作者goonerboi
相关产品推荐
相关产品推荐

