【问题标题】:Select encoding while writing a CSV file in pypark在 pyspark 中写入 CSV 文件时选择编码
【发布时间】:2019-06-28 04:16:05
【问题描述】:

我正在尝试设置正确的编码,同时使用 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 gzipped 文件中并检查回来时,特殊字符没有得到很好的解码:

# 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

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

【问题讨论】:

    标签: python csv apache-spark encoding pyspark


    【解决方案1】:

    根据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 编码。

    【讨论】:

    • 感谢您的回复!将编码参数放入 csv() 方法时出现此错误:TypeError: csv() got an unexpected keyword argument 'encoding' 当我尝试该方法时:sp_df.repartition(5, 'Zone').write.option('sep', ';').option('encoding', 'cp1252').mode('overwrite').format('com.databricks.spark.csv').option('codec', 'org.apache.hadoop.io.compress.GzipCodec').save(output_path, header = 'true') 在保存文件时我仍然应用了默认的“utf-8”编码...跨度>
    • @oso_ted 您的csv 方法显然存在问题,因为您不应该收到您描述的错误TypeErrorencodinglegit argument for this method。在不使用压缩的情况下,你仍然得到相同的编码吗?
    猜你喜欢
    • 2017-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-10
    • 2018-11-18
    • 2018-06-14
    • 1970-01-01
    • 2014-07-01
    相关资源
    最近更新 更多