PySpark读取CSV文件时误读同目录TXT文件的问题
解决PySpark读取CSV时意外加载TXT文件的问题
当你用Spark读取文件夹路径时,默认会扫描并尝试解析文件夹下所有文件,不管后缀名——只要文件内容符合你指定的格式(这里是CSV),就会被加载进来。你的TXT文件因为列名和CSV一致、格式兼容,所以被一起读入了。
下面是几种高效的解决方法:
方法1:直接指定CSV后缀的文件路径
把加载路径改成带通配符的形式,只匹配.csv文件:
from pyspark.sql import SparkSession spark = SparkSession.builder.appName("CSV Reader").getOrCreate() csv_path = "path/to/csv/folder/*.csv" # 用*.csv匹配所有CSV文件 df = spark.read \ .format("csv") \ .option("header", "true") \ .option("inferSchema", "true") \ .load(csv_path)
方法2:使用pathGlobFilter选项过滤文件
在读取配置里添加pathGlobFilter参数,精准指定只加载后缀为.csv的文件:
from pyspark.sql import SparkSession spark = SparkSession.builder.appName("CSV Reader").getOrCreate() csv_path = "path/to/csv/folder" df = spark.read \ .format("csv") \ .option("header", "true") \ .option("inferSchema", "true") \ .option("pathGlobFilter", "*.csv") # 新增过滤选项 .load(csv_path)
不推荐:读取后过滤(效率较低)
如果已经读取了所有文件,也可以通过input_file_name()函数获取行的源文件路径,再过滤掉TXT文件。但这种方法会先加载所有文件,效率不如前两种,仅作备选:
from pyspark.sql import SparkSession from pyspark.sql.functions import input_file_name spark = SparkSession.builder.appName("CSV Reader").getOrCreate() csv_path = "path/to/csv/folder" df = spark.read \ .format("csv") \ .option("header", "true") \ .option("inferSchema", "true") \ .load(csv_path) # 过滤来源为TXT的行 df_filtered = df.filter(input_file_name().endswith(".csv"))
内容的提问来源于stack exchange,提问作者RajatK350
相关产品推荐
相关产品推荐

