PySpark发送CSV附件邮件异常:CSV内容全部显示在同一行
嘿,我一眼就揪出问题所在了——不是你生成CSV的步骤有问题,而是读取CSV并转换为邮件附件的环节搞砸了!
问题到底出在哪?
你用sc.textFile("/dbfs/<path>/df.csv").collect()读取文件时,得到的是一个列表,每个元素对应CSV里的一行,但这些元素末尾是没有换行符的。然后你用"".join(filedata.collect())把所有行直接拼在了一起,完全没加换行——这就把原本多行的CSV硬生生压缩成了一行,表头和所有数据挤在同一行,可不就变成6万列1行吗?
两种快速修复方案
方案1:拼接时补上换行符
只需要把拼接的代码改成用换行符连接每行内容就行:
part = MIMEApplication("\n".join(filedata.collect()), Name="df.csv")
方案2:用Python本地文件读取(更推荐)
既然文件已经存在DBFS上,直接用Python内置的文件操作读取更稳妥,还能避免Spark API带来的换行问题:
# 替换原来的filedata和part相关代码 with open("/dbfs/<path>/df.csv", "rb") as f: part = MIMEApplication(f.read(), Name="df.csv") part['Content-Disposition'] = 'attachment; filename="%s"' % 'df.csv'
额外优化小技巧
如果你不需要把CSV先存到DBFS,其实可以直接把Pandas DataFrame转成CSV字符串,跳过写入文件的步骤,效率更高:
# 直接生成CSV内容,不用写文件 csv_content = df.toPandas().to_csv(index=False, encoding='utf-8') part = MIMEApplication(csv_content.encode('utf-8'), Name="df.csv")
(加个index=False还能避免把DataFrame的索引列写入CSV,省得出现多余的无用列)
内容的提问来源于stack exchange,提问作者Ashley O
相关产品推荐
相关产品推荐

