PySpark读取不同路径多CSV文件报错及多Schema文件合并咨询
问题分析与解决方案
错误原因
你把两个文件路径放在同一个字符串里用逗号分隔,Spark会将整个带逗号的字符串视为单个文件路径,而这个拼接出来的路径实际并不存在,因此抛出PATH_NOT_FOUND错误。单独读取时路径格式正确,但合并写法错误导致路径解析失败。
解决方案(同Schema文件合并)
以下三种方法可正确读取多个同Schema的CSV文件并合并为一个DataFrame:
方法1:传入路径列表
直接给load()方法传入包含多个路径的列表,Spark会自动合并同Schema的文件:
from pyspark.sql import SparkSession spark = SparkSession.builder.master("local[1]").appName("Import_from_multiplefiles").getOrCreate() # 用列表传入多个独立路径 file_paths = [ "D:/Dir1/Dir1.1/File1.csv", "D:/Dir2/Dir2.1/File2.csv" ] df2 = spark.read.format('csv').load(file_paths) df2.show(5, False)
方法2:使用通配符(路径有规律时)
如果文件路径存在共同的命名或目录规律,可通过通配符*批量匹配:
# 示例:匹配Dir1、Dir2下所有子目录中的csv文件 df2 = spark.read.format('csv').load("D:/Dir*/Dir*.*/File*.csv")
方法3:分别读取后Union
先单独读取每个文件,再用union()合并(适合需要对单个文件做预处理的场景):
df1 = spark.read.format('csv').load("D:/Dir1/Dir1.1/File1.csv") df2 = spark.read.format('csv').load("D:/Dir2/Dir2.1/File2.csv") combined_df = df1.union(df2) combined_df.show(5, False)
不同Schema文件的合并处理
可以合并不同Schema的CSV文件,需通过以下方式处理Schema差异:
方法1:启用mergeSchema参数
读取时设置mergeSchema=True,Spark会自动合并所有文件的Schema,缺失字段填充为null:
file_paths = [ "D:/path/to/schema1.csv", "D:/path/to/schema2.csv" ] df = spark.read.format('csv') \ .option("header", "true") # 若文件带表头需开启此参数 .option("mergeSchema", "true") \ .load(file_paths)
方法2:手动统一Schema
先定义一个统一的Schema,强制所有文件按该Schema读取,缺失字段填充null,多余字段被忽略:
from pyspark.sql.types import StructType, StructField, StringType, IntegerType # 定义统一的目标Schema unified_schema = StructType([ StructField("id", IntegerType(), nullable=True), StructField("name", StringType(), nullable=True), StructField("age", IntegerType(), nullable=True) ]) df = spark.read.format('csv') \ .option("header", "true") \ .schema(unified_schema) \ .load(file_paths)
内容的提问来源于stack exchange,提问作者anurag singh
相关产品推荐
相关产品推荐

