AWS Glue Pyspark如何移除S3中TXT文件每行末尾的多余分隔符?
问题根因
源文件每行末尾的多余|~|分隔符,会导致直接调用split切分后,结果列表比预期多出1个空字符串元素。例如对A1|~|B1|~|C1|~|D1|~|执行切分,会得到长度为5的列表['A1', 'B1', 'C1', 'D1', ''],最终生成的DataFrame就会多出一个无意义的空列。
具体实现方案
基于现有RDD代码的最小改动
直接修改原有文本切分逻辑,先剥离每行末尾的多余分隔符,再执行切分,从根源上避免生成长度超出预期的元素列表。处理时使用正则匹配行尾的分隔符后缀,避免简单字符串操作误伤有效字段内容:import re # 编译正则:精准匹配行尾连续出现的|~|分隔符,不影响字段内部的同类字符 tail_sep_pattern = re.compile(r"(\|~\|)+$") # 读取文件时先过滤完全空白的行(匹配源文件行间存在空行的场景) raw_rdd = sc.textFile("s3://你的文件路径/filename.TXT").filter(lambda line: line.strip() != "") processed_rdd = raw_rdd.map( lambda line: tail_sep_pattern.sub("", line) # 移除行尾所有多余的|~|分隔符 .split("|~|") # 按分隔符正常切分 ) # 生成DataFrame,列数和切分后的列表长度完全匹配 df = spark.createDataFrame(processed_rdd, list_of_colun_names)更高性能的内置读取方案
不需要手动通过RDD切分文本,直接调用Spark内置的CSV文本读取接口,指定自定义分隔符,依托Spark本身的解析逻辑处理末尾空列场景,整体处理性能比手动RDD切分更高:df = spark.read \ .option("sep", "|~|") \ # 指定多字符自定义分隔符 .option("header", "false") \ # 源文件无表头 .option("ignoreTrailingWhitespace", "true") \ .schema(list_of_colun_names) \ # 直接传入预期的列结构 .csv("s3://你的文件路径/filename.TXT")
常见踩坑注意事项
- 不要使用切分后直接
pop最后一个元素的处理方式:如果个别行的末尾没有多余分隔符,pop操作会直接删掉最后一列的合法业务值,造成数据丢失。 - 必须过滤文件中的空白行:源文件行间存在空行,空行切分后会生成空列表,触发DataFrame列数不匹配的报错。
- 不要直接使用简单的
line.rstrip("|~|")处理后缀:如果某列的合法业务值本身以|或~结尾,简单的字符剥离会直接剪掉有效字段的内容,造成数据错误。
内容的提问来源于stack exchange,提问作者Beginner
相关产品推荐
相关产品推荐

