如何解决PySpark DataFrame读取含非英文字符CSV文件的编码乱码问题
解决步骤
1. 调整读取参数解决核心问题
你遇到的乱码大概率是两个参数配置错误导致的:
- 波斯语CSV如果是Windows环境下生成/编辑,默认编码通常是
CP1256(Windows-1256)而非UTF-8 - 你的文件是制表符分隔,Spark CSV默认分隔符为逗号,字段拆分错误会导致字符拼接乱码
- 部分Spark版本仅识别
charset参数作为编码配置,encoding参数不生效
修改后的读取代码如下:
df = spark.read.option("inferSchema","true")\ .option("charset", "CP1256")\ # 如果确认文件是UTF-8编码就替换为utf-8,也可尝试ISO-8859-6 .option("sep", "\t")\ # 强制指定制表符为分隔符 .csv("1399-12-27.csv")\ .toDF( 'simbol', 'name', 'count', 'volume', 'Value', 'lastday', 'first', 'lastTransactionamount', 'lastTransactionChange', 'lastTransactionPercentage', 'finalpriceamount', 'finalpriceChange', 'finalpricePercentage', 'min', 'max', 'date')
2. 排除显示环境问题
如果修改参数后show()仍显示乱码,属于运行环境的显示编码不支持波斯语,不是读取错误:
- Windows系统可先在终端执行
chcp 65001切换为UTF-8编码后再运行代码 - 可直接提取字段验证读取结果:
print(df.first()['name']),或把单条字段内容存为本地文本文件打开确认
3. 兜底转码方案
如果以上方法都无效,可先把文件转码为UTF-8后再读取:
import pandas as pd # 用对应编码读取本地文件 df_pd = pd.read_csv("1399-12-27.csv", encoding="CP1256", sep="\t", header=None) # 导出为UTF-8编码的新文件 df_pd.to_csv("1399-12-27_utf8.csv", encoding="utf-8", index=False, header=False) # 再用Spark读取新文件即可
内容的提问来源于stack exchange,提问作者Ali Hosein pour
相关产品推荐
相关产品推荐

