如何使用Java在Spark Dataset中过滤列并删除含特殊字符的行
问题解决:Spark Dataset过滤删除含特殊字符的行
原代码失效原因
- Spark Dataset为不可变数据结构,
withColumn方法会返回全新的Dataset实例,原代码没有接收返回值,修改自然不会生效 - 你的核心需求是删除含特殊字符的行,而非修改字段内容,
regex_replace仅能替换字段内的字符,无法实现行过滤的效果
正确实现代码
直接过滤删除含非ASCII特殊字符的行
使用filter配合rlike正则匹配即可实现行级过滤,保留完全由ASCII字符组成的行:
import org.apache.spark.sql.functions; // 过滤掉nameColumn中存在非ASCII特殊字符的行 Dataset<Row> filteredDataset = dataset.filter( functions.not( functions.col("nameColumn").rlike("[^\\p{ASCII}]") ) );
若仍需要替换特殊字符为空的场景
记得接收withColumn返回的新Dataset才能生效:
import org.apache.spark.sql.functions; Dataset<Row> replacedDataset = dataset.withColumn( "nameColumn", functions.regexp_replace(functions.col("nameColumn"), "[^\\p{ASCII}]", "") );
自定义调整说明
如果你的「特殊字符」定义和非ASCII不一致,可自行调整正则规则:
- 如需保留中文、数字、英文字母,可将正则替换为
[^a-zA-Z0-9\u4e00-\u9fa5] - 如需额外保留指定符号(比如下划线、横杠),可直接在正则的中括号内添加对应字符即可
内容的提问来源于stack exchange,提问作者Leone Pizzoli
相关产品推荐
相关产品推荐

