PySpark写入CSV文件时每条记录末尾出现额外字符问题
问题解决:PySpark合并列存CSV后记录末尾多出额外字符
可能原因及对应解决办法
1. CSV写入的换行符格式问题
PySpark默认CSV写入器在不同系统下可能使用不同换行符(比如Windows的\r\n,Linux下是\n),用awk '{print length($0)}'检查时,\r会被计入字符长度,导致结果超出预期。
解决办法:写入CSV时显式指定Linux风格换行符:
df2.coalesce(1).write.format('csv') .option('lineSep', '\n') .mode('overwrite') .save('/axp/aet/gardpa/dev/testfolder/pyspark')
2. 原字段含隐藏空白字符
如果原始4列的字段末尾带有空格、制表符等隐藏空白,show(truncate=False)不会直观显示,但合并后会被保留,导致记录长度超标。
解决办法:合并前先对每一列做trim处理,去除首尾空白:
from pyspark.sql.functions import col, trim, concat # 先清理每列的首尾空白再合并 df2 = df2.withColumn('onecol', concat(*(trim(col(c)) for c in df2.columns))).select('onecol')
3. CSV自动添加的引号
如果合并后的字段包含逗号、引号等特殊字符,PySpark会自动给字段套双引号,这也会增加记录长度。若你的数据无特殊字符,可以禁用引号功能:
df2.coalesce(1).write.format('csv') .option('quote', '') .option('escape', '') .mode('overwrite') .save('/axp/aet/gardpa/dev/testfolder/pyspark')
验证方法
修改代码重新生成CSV后,用以下命令同时查看记录长度和内容,方便定位问题:
cat test.txt | awk '{print length($0), $0}'
内容的提问来源于stack exchange,提问作者amandeep gandhi
相关产品推荐
相关产品推荐

