在pypark中写入CSV文件时选择编码

时间:2019-02-04 12:13:37

标签: python csv apache-spark encoding pyspark

我正在尝试使用pyspark保存CSV压缩文件时设置正确的编码。

这是我的考试:

# read main tabular data
sp_df = spark.read.csv(file_path, header=True, sep=';', encoding='cp1252')
sp_df.show(5)
+----------+---------+--------+---------+------+
|      Date|     Zone|   Duree|     Type|Volume|
+----------+---------+--------+---------+------+
|2019-01-16|010010000| 30min3h|Etrangers|   684|
|2019-01-16|010010000| 30min3h| Français| 21771|
|2019-01-16|010010000|Inf30min|Etrangers|  7497|
|2019-01-16|010010000|Inf30min| Français| 74852|
|2019-01-16|010010000|   Sup3h|Etrangers|   429|
+----------+---------+--------+---------+------+
only showing top 5 rows

我们可以看到使用编码CP1252正确地解释了数据。问题是,当我使用CP1252编码将数据保存在CSV压缩文件中并进行核对时,特殊字符无法正确解码:

# Save Data
sp_df.repartition(5, 'Zone').write.option('encoding', 'cp1252').csv(output_path, mode='overwrite', sep=';', compression='gzip')

# read saved data
spark.read.csv(os.path.join(output_path, '*.csv.gz'), header=True, sep=';', encoding='cp1252').show()
+----------+---------+--------+---------+------+
|      Date|     Zone|   Duree|     Type|Volume|
+----------+---------+--------+---------+------+
|2019-01-16|010070000| 30min3h|Etrangers|  1584|
|2019-01-16|010070000| 30min3h|Français| 18662|
|2019-01-16|010070000|Inf30min|Etrangers| 12327|
|2019-01-16|010070000|Inf30min|Français| 30368|
|2019-01-16|010070000|   Sup3h|Etrangers|   453|
+----------+---------+--------+---------+------+
only showing top 5 rows

有什么想法吗? 我正在使用Spark 2.3

1 个答案:

答案 0 :(得分:0)

根据official documentation,编码是一种选项,您应该直接将其放入csv方法中,就像使用它进行读取一样。

sp_df.repartition(5, 'Zone').write.option('encoding', 'cp1252').csv(output_path, mode='overwrite', sep=';', compression='gzip')

成为

sp_df.repartition(5, 'Zone').write.csv(output_path, mode='overwrite', sep=';', compression='gzip', encoding='cp1252')

csv方法encoding=None的默认参数将覆盖您的编写方式,从而导致UTF-8编码。

相关问题