Spark 3.3.0在Java环境中不遵循自定义Schema的非空约束问题
问题原因与解决办法
你遇到的这个情况是Spark CSV数据源的默认行为导致的:
Spark的CSV读取器默认会忽略你手动指定Schema中的nullable设置,强制将所有字段标记为可空(nullable = true)。这是因为CSV属于半结构化文本格式,无法保证文件中不存在空值、缺失列等情况,Spark为了避免读取过程中因数据不完整抛出异常,默认做了这个兼容处理。
解决步骤
要让Spark严格遵循你指定的nullable设置,只需要在读取CSV时添加enforceSchema选项并设为true即可:
Dataset<Row> df = spark.read().format("csv") .option("header", "false") .option("enforceSchema", true) // 添加该选项强制遵循指定Schema .schema(schema) .load("path/to/file.csv"); df.printSchema();
添加后再执行printSchema(),就能看到id列的nullable被正确设置为false了。
另外需要注意:开启enforceSchema后,如果CSV文件中出现id列为空的行,Spark会直接抛出异常,这完全符合你设置nullable=false的预期——确保该列无空值。
内容的提问来源于stack exchange,提问作者Garret Wilson
相关产品推荐
相关产品推荐

