Spark读取Parquet:父路径无法推断Schema报错,子路径正常问题求助
问题分析与解决方案
你遇到的这种情况很常见,核心原因是Spark在读取父目录时会扫描路径下所有文件(包括各级子目录中的文件),如果存在非Parquet格式文件、空文件或Schema无法统一的文件,就会导致Schema推断失败,而直接读取子目录时仅扫描合法的Parquet文件,所以能正常运行。
以下是具体的排查和解决方法:
1. 清理父目录下的无效文件
检查v3io://projects/risk/FeatureStore/ptp/parquet/路径下(包括各级子目录)是否存在:
- 非
.parquet后缀的文件(比如日志、临时缓存文件、空文件) - 损坏的Parquet文件
找到后删除或移动这些无效文件,再尝试读取父目录。
2. 使用过滤参数仅读取Parquet文件
通过pathGlobFilter参数指定只扫描.parquet后缀的文件,跳过其他无效文件:
new_DF = spark.read.parquet( "v3io://projects/risk/FeatureStore/ptp/parquet/", pathGlobFilter="*.parquet" ) new_DF.show()
3. 用通配符精准匹配目标文件
如果知道合法文件的路径结构,也可以用通配符直接匹配所有子目录下的Parquet文件:
new_DF = spark.read.parquet( "v3io://projects/risk/FeatureStore/ptp/parquet/**/*.parquet" ) new_DF.show()
**表示递归匹配所有子目录。
4. 手动指定Schema跳过推断步骤
如果上述方法都无效,可以先从能正常读取的子目录获取Schema,再手动指定给父目录读取:
# 从有效子目录获取Schema valid_df = spark.read.parquet("v3io://projects/risk/FeatureStore/ptp/parquet/sets/ptp/1681296898546_70/") target_schema = valid_df.schema # 手动指定Schema读取父目录 new_DF = spark.read.schema(target_schema).parquet( "v3io://projects/risk/FeatureStore/ptp/parquet/" ) new_DF.show()
内容的提问来源于stack exchange,提问作者JIST
相关产品推荐
相关产品推荐

