Spark RDD如何正确过滤文本文件中的空白行
问题说明
现有名为ds_text_file的文本文件,需要过滤文本段落之间的空白行,先后尝试两种代码实现均未达到预期效果,需要可行的解决方法。
已尝试的代码
- 方案1:直接判断行长度
lines = sc.textFile(ds_text_file) filteredLines = lines.filter(lambda x: len(x)>0)
- 方案2:判断行分割后的内容长度
lines = sc.textFile(ds_text_file) filteredLines = lines.filter(lambda x: len(x.split())>0)
失效原因
两种方案失效的核心原因是没有处理空白行中可能存在的特殊不可见字符:
- 方案1的
len(x)>0无法过滤带半角空格、制表符\t、回车符\r、全角空格、零宽空格等不可见字符的“伪空白行”,这类行长度不为0,但实际没有有效内容 - 方案2的
x.split()默认仅按半角空白类字符分割,遇到全角空格、编码异常产生的不可见乱码字符时,会误将空白行判定为有效行
正确实现
先对每行做首尾空白字符剥离,再判断内容是否非空即可覆盖绝大多数场景:
lines = sc.textFile(ds_text_file) filteredLines = lines.map(lambda x: x.strip()).filter(lambda x: len(x) > 0)
如果文件存在编码混杂、乱码行较多的情况,可以增加编码兼容处理,避免任务报错:
lines = sc.textFile(ds_text_file, use_unicode=True) filteredLines = lines.map( lambda x: x.strip().encode("utf-8", "ignore").decode("utf-8") ).filter(lambda x: len(x) > 0)
内容的提问来源于stack exchange,提问作者FutureDataScientist
相关产品推荐
相关产品推荐

