如何使用PySpark删除RDD中的不可打印字符?已尝试代码未生效
搞定RDD中不可打印字符的移除问题
嘿,我知道你为啥之前的代码没生效了!那个烦人的•符号(项目符号),它的UTF-8编码是\xe2\x80\xa2,你只替换了\xe2这一部分,剩下的\x80\xa2还留在字符串里,所以看起来跟没处理一样。
下面给你几个靠谱的解决方案,从简单到通用,还有更高效的DataFrame处理方式:
方案1:精准替换目标特殊字符
直接把整个•的编码组合换掉就行,另外要注意——RDD里的元素是Row对象,不是纯字符串,得遍历每个字段处理:
cleaned_rdd = sqlContext.read.option("sep", ","). \ option("encoding", "ISO-8859-1"). \ option("mode", "PERMISSIVE").csv(<path>).rdd.map( lambda row: tuple( field.replace("\xe2\x80\xa2", "") if field is not None else field for field in row ) )
方案2:正则批量清理所有特殊/不可打印字符
如果还有其他奇奇怪怪的不可打印字符,用正则匹配更省心,一次性清掉所有非标准可打印字符:
import re # 覆盖常见的不可打印ASCII字符和特殊符号,你可以根据需求调整 clean_pattern = re.compile(r'[\x00-\x1f\x7f-\x9f\u2022\u2023]') cleaned_rdd = sqlContext.read.option("sep", ","). \ option("encoding", "ISO-8859-1"). \ option("mode", "PERMISSIVE").csv(<path>).rdd.map( lambda row: tuple( clean_pattern.sub("", field) if field is not None else field for field in row ) )
方案3:用DataFrame API处理(更推荐!)
Spark的DataFrame API比RDD性能好太多,而且写法更简洁,不用手动拆Row:
from pyspark.sql.functions import regexp_replace, col # 先读成DataFrame raw_df = sqlContext.read.option("sep", ","). \ option("encoding", "ISO-8859-1"). \ option("mode", "PERMISSIVE").csv(<path>) # 对所有字符串类型的列自动清理 cleaned_df = raw_df.select([ regexp_replace(col(col_name), r'[\x00-\x1f\x7f-\x9f\u2022]', "").alias(col_name) if raw_df.dtypes[raw_df.columns.index(col_name)][1] == 'string' else col_name for col_name in raw_df.columns ]) # 需要转RDD的话直接转 cleaned_rdd = cleaned_df.rdd
用这些方案处理你的示例数据:
输入:"@TSX•","None" "@MJU•","None"
输出:@TSX,None @MJU,None
完全能达到你要的效果~
内容的提问来源于stack exchange,提问作者LUZO
相关产品推荐
相关产品推荐

