如何使用UTF-8编码解析CSV文件?

10
我将使用Spark 2.1。 输入的csv文件包含Unicode字符,如下所示。

unicode-input-csv

解析此csv文件时,输出结果如下所示

unicode-output-csv

我使用MS Excel 2010来查看文件。
使用的Java代码为:
@Test
public void TestCSV() throws IOException {
    String inputPath = "/user/jpattnaik/1945/unicode.csv";
    String outputPath = "file:\\C:\\Users\\jpattnaik\\ubuntu-bkp\\backup\\bug-fixing\\1945\\output-csv";
    getSparkSession()
      .read()
      .option("inferSchema", "true")
      .option("header", "true")
      .option("encoding", "UTF-8")
      .csv(inputPath)
      .write()
      .option("header", "true")
      .option("encoding", "UTF-8")
      .mode(SaveMode.Overwrite)
      .csv(outputPath);
}

如何获得与输入相同的输出?


1
谢谢@Jacek,我使用file命令检查了文件编码,并知道该文件的编码实际上是ISO-8859-1,因此我相应地解析了这个文件并得到了期望的结果。 - Jyoti Ranjan
4个回答

18

我能够使用Spark读取ISO-8859-1格式的数据,但是当我将相同的数据存储到S3 / HDFS并重新读取时,格式会转换为UTF-8。

例如:é 变成了 é

val df = spark.read.format("csv").option("delimiter", ",").option("ESCAPE quote", '"'). option("header",true).option("encoding", "ISO-8859-1").load("s3://bucket/folder")

{btsdaf} - Saida
1
{btsdaf} - mch
1
如果有人在尝试将Excel CSV文件读入Spark中,Excel中有一个选项可以使用UTF-8编码保存CSV。如果您使用此选项存储CSV,则无需指定编码为ISO-8859-1。 - Omkar Neogi

4
我的猜测是输入文件不是UTF-8编码,因此您会得到不正确的字符。
我的建议是编写一个纯Java应用程序(完全没有Spark),并查看是否使用UTF-8编码读取和写入会得到相同的结果。

2

.option('encoding', 'ISO-8859-1') 对我有用。其他例如重音符、插入符、塞迪利亚等字符也能正确显示。


0

同样的问题,我通过使用"UTF-8"解决了编码问题。

  input_df = (spark.read
              .option("sep", sep)
              .option("header", "true")
              .option("encoding", "UTF-8")
              .csv(my_path)
              )

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接