Spark本地模式下无法生成badrecord文件问题咨询
Spark本地环境CSV坏记录未生成文件排查方案
核心问题排查点
- 路径配置错误
badRecordsPath参数接收的是目录路径而非文件路径,你配置的/src/test/resources/bad.txt会被Spark识别为目录名,最终坏记录会以分片文件形式存储在该目录下,不会生成名为bad.txt的单独文件。同时要注意:- 绝对路径
/src/开头在Windows环境会指向当前磁盘根目录,macOS/Linux环境需要确认运行程序的用户对该路径有读写权限 - 建议改为相对路径(如
./src/test/resources/bad_records)避免跨环境路径异常
- 绝对路径
- mode参数冲突
部分Spark版本下,DROPMALFORMED模式仅会直接丢弃坏记录,不会触发badRecordsPath的写入逻辑,需要将mode修改为PERMISSIVE才会同时执行坏记录落盘、正常记录解析的逻辑。 - 数据源依赖不兼容
你使用的第三方com.databricks.spark.csv是Spark 2.0之前的旧数据源包,多数版本未实现badRecordsPath能力,Spark 2.0及以上版本已内置CSV数据源,直接替换为format("csv")即可使用官方支持的坏记录收集能力。 - 未触发Action执行
你当前编写的代码仅包含map、zipWithIndex这类惰性执行的Transformation算子,没有调用count、saveAsTextFile、collect等Action算子的情况下,整个CSV读取逻辑不会实际运行,自然不会生成坏记录文件。 - Schema匹配规则不符预期
Spark仅会将不符合Schema定义的记录判定为坏记录(如字段数量不匹配、字段类型转换失败),如果记录格式符合Schema但不符合业务规则,不会被自动归类到坏记录中,需要自行编写过滤逻辑收集。
修正后参考代码
val inputDFRdd = spark.read.format("csv") .option("mode", "PERMISSIVE") .option("badRecordsPath", "./src/test/resources/bad_records") .option("delimiter", ";") .option("header", "false") .schema(customSchema) .option("escape", "\"") .load(filepath) .rdd .zipWithIndex() .map(line => Row.fromSeq(Seq(line._2 + 1) ++ line._1.toSeq)) // 调用Action触发执行,可替换为实际业务输出逻辑 inputDFRdd.count()
内容的提问来源于stack exchange,提问作者Sang
相关产品推荐
相关产品推荐

