PySpark读取ORC文件时过滤空/不完整文件的问题求助
解决PySpark读取ORC文件时忽略小文件/不完整文件的问题
原代码存在的问题
- 遍历列表时直接修改原列表
file_list,把文件大小数值追加进去,导致列表混杂了文件名和数字,完全偏离筛选有效文件路径的目的。 - 大小判断逻辑错误:代码中
size > 6500是筛选大于6.5KB的文件,而你实际需求是6.5MB,正确的字节数应为6.5 * 1024 * 1024 = 6815744。 - 未处理路径下的子目录:如果目标路径里存在子文件夹,
os.path.getsize会抛出异常,因为无法获取目录的大小。 - 最终加载数据时仍使用整个根路径,完全没用到前面的筛选结果,等于白做了循环逻辑。
修正后的代码实现
import os from pyspark.sql import SparkSession # 初始化SparkSession spark = SparkSession.builder.appName("ReadValidORC").getOrCreate() path = "/home/data/raw_data/" valid_orc_files = [] # 遍历目录(含子目录),筛选符合条件的ORC文件 for root, _, files in os.walk(path): for file in files: # 只处理ORC后缀的文件 if file.endswith(".orc"): full_path = os.path.join(root, file) try: file_size = os.path.getsize(full_path) # 筛选大于6.5MB的文件 if file_size > 6815744: valid_orc_files.append(full_path) except OSError as e: print(f"跳过异常文件: {full_path}, 错误信息: {e}") continue # 加载筛选后的有效文件 if valid_orc_files: raw_df = spark.read.format("orc").load(valid_orc_files) # 可添加后续数据处理逻辑 raw_df.show() else: print("未找到符合条件的ORC文件")
补充说明
- 如果不需要遍历子目录,可将
os.walk替换为os.listdir,并增加os.path.isfile(os.path.join(path, file))判断,确保只处理文件。 - 加入
try-except块是为了避免因文件权限、文件被删除等意外情况导致程序崩溃。 - 明确过滤
.orc后缀,可避免加载路径下的其他无关文件。
内容的提问来源于stack exchange,提问作者Buddhadeb Mondal
相关产品推荐
相关产品推荐

