如何让Apache Spark CSV API仅读取CSV文件,排除.xlsx文件?
解决Spark CSV API读取文件夹时跳过.xlsx文件的问题
可以通过以下几种方式实现只读取CSV文件,避免读取.xlsx文件:
方法1:使用文件后缀通配符直接指定CSV文件
最直接的方式是在文件路径中使用*.csv通配符,让Spark只匹配后缀为.csv的文件:
SparkSession.option("header", "true") .option("delimiter", delimiter) .option("ignoreTrailingWhiteSpace", true) .option("ignoreLeadingWhitespaces", true) .csv(directoryPath + "\\" + feedFolder + "\\*.csv");
这种方式简单高效,Spark在扫描文件时会直接过滤掉非.csv后缀的文件,不会读取.xlsx或其他格式文件。
方法2:使用Spark的pathGlobFilter选项
可以通过设置pathGlobFilter配置项,指定需要匹配的文件模式:
SparkSession.option("header", "true") .option("delimiter", delimiter) .option("ignoreTrailingWhiteSpace", true) .option("ignoreLeadingWhitespaces", true) .option("pathGlobFilter", "*.csv") .csv(directoryPath + "\\" + feedFolder + "\\*");
这个选项会让Spark在读取文件时只保留符合*.csv模式的文件,同样能跳过.xlsx文件。
方法3:读取所有文件后过滤(适合复杂场景)
如果需要更灵活的过滤逻辑(比如同时读取CSV和TXT但跳过XLSX),可以先读取所有文件,再通过input_file_name()函数获取文件名并过滤:
import org.apache.spark.sql.functions.input_file_name val df = SparkSession.option("header", "true") .option("delimiter", delimiter) .option("ignoreTrailingWhiteSpace", true) .option("ignoreLeadingWhitespaces", true) .csv(directoryPath + "\\" + feedFolder + "\\*") // 过滤掉.xlsx文件 val filteredDf = df.filter(!input_file_name().endsWith(".xlsx"))
这种方式适合需要同时处理多种文件类型,但排除特定格式的场景。
内容的提问来源于stack exchange,提问作者Daksh
相关产品推荐
相关产品推荐

