Проблема записи в CSV (немецкие символы) в Spark с кодировкой UTF-8 - PullRequest
1 голос
/ 20 апреля 2020

У меня есть набор данных компаний (во всем мире), где есть множество компаний с иностранными названиями.

Сначала я импортирую данные паркета, используя:

val df = spark.read.format("parquet").load("import path").

Я выполняю некоторую фильтрацию и манипуляцию, и когда я записываю данные в csv, отображаются странные символы даже после того, как я задаю кодировку.

  • Sanitär Wirth
  • Китцбюэль Загородный клуб
  • Hotelovà škola SvÄ tlá StÅ ™ ednà odb. Å¡kola Å ™ emesel

Как экспортировать данные, чтобы иностранные символы были точно представлены ??

df.coalesce(1).
        write.
        mode(SaveMode.Overwrite).
        format("csv").
        option("header", true).
        option("encoding", "UTF-8").
        partitionBy("Region").
        save("path")

Ответы [ 2 ]

1 голос
/ 22 апреля 2020

Я думаю, вы должны указать правильную кодировку для немецких символов. или редактор, который вы открываете, искажает символы своей собственной кодировкой (возможно, ошибка редактора). Обычно и utf-8, и iso-8859 выполняют кодирование одинаково. После общения с @ GP I я также протестировал код ниже в формате utf-8. out out был тем же, используя intellijeditor. Я открыл полученный текстовый файл.


ОБНОВЛЕНИЕ / Заключение: нижеприведенный способ с использованием iso или utf-8 должен работать аналогично , Это может быть текстовый редактор OPS, с помощью которого он открывает, может быть причиной этой проблемы. Там, где проблема не является проблемой.

 df.coalesce(1).
    write.
    mode(SaveMode.Overwrite).
    format("csv").
    option("header", true).
   .option("encoding", "ISO-8859-1") 
    partitionBy("Region").
    save("path")

Взятые образцы данных немецких символов и снова сохранены как csv в файловой системе. Вот пример и код.

package examples

import org.apache.log4j.Level
import org.apache.spark.sql.{DataFrame, SaveMode, SparkSession}
object GermanCSV extends App {
  val logger = org.apache.log4j.Logger.getLogger("org")
  logger.setLevel(Level.WARN)

  val spark = SparkSession.builder().appName(this.getClass.getName).master("local").getOrCreate()

  import spark.implicits._

  val mycsvdata =
    """
      |rank,freq,Infinitiv,Unreg,Trans,"Präsens_ich","Präsens_du","Präsens_er, sie, es","Präteritum_ich","Partizip II","Konjunktiv II_ich","Imperativ Singular","Imperativ Plural",Hilfsverb
      |3,3796784,sein,"","",bin,bist,ist,war,gewesen,"wäre",sei,seid,sein
      |8,1618550,haben,"","",habe,hast,hat,hatte,gehabt,"hätte",habe,habt,haben
      |10,1379496,einen,"","",eine,einst,eint,einte,geeint,einte,eine,eint,haben
      |12,948246,werden,"","",werde,wirst,wird,wurde,geworden,"würde",werde,werdet,sein
    """.stripMargin.lines.toList.toDS


  val csvdf: DataFrame = spark.read.option("header", true)
    .option("header", true)
    .csv(mycsvdata)

  println("orginal data")
  csvdf.show(false)

  println("Writing in to a csv file with ISO-8859-1 encoding way , handling german characters")

  csvdf.coalesce(1).
    write.
    mode(SaveMode.Overwrite).
    format("csv").
    option("header", true)
    .option("encoding", "ISO-8859-1")
    .save("data/iso8859-1")
 }


Результат:

[2020-04-22 10:26:36,598] WARN Unable to load native-hadoop library for your platform... using builtin-java classes where applicable (org.apache.hadoop.util.NativeCodeLoader:62)
orginal data
+----+-------+---------+-----+-----+-----------+----------+-------------------+--------------+-----------+-----------------+------------------+----------------+---------+
|rank|freq   |Infinitiv|Unreg|Trans|Präsens_ich|Präsens_du|Präsens_er, sie, es|Präteritum_ich|Partizip II|Konjunktiv II_ich|Imperativ Singular|Imperativ Plural|Hilfsverb|
+----+-------+---------+-----+-----+-----------+----------+-------------------+--------------+-----------+-----------------+------------------+----------------+---------+
|3   |3796784|sein     |null |null |bin        |bist      |ist                |war           |gewesen    |wäre             |sei               |seid            |sein     |
|8   |1618550|haben    |null |null |habe       |hast      |hat                |hatte         |gehabt     |hätte            |habe              |habt            |haben    |
|10  |1379496|einen    |null |null |eine       |einst     |eint               |einte         |geeint     |einte            |eine              |eint            |haben    |
|12  |948246 |werden   |null |null |werde      |wirst     |wird               |wurde         |geworden   |würde            |werde             |werdet          |sein     |
+----+-------+---------+-----+-----+-----------+----------+-------------------+--------------+-----------+-----------------+------------------+----------------+---------+

Writing in to a csv file with ISO-8859-1 encoding way , handling german characters


Сохранение CSV согласно коду data/iso8859-1 без изменения данных ... как показано ниже:

rank,freq,Infinitiv,Unreg,Trans,Präsens_ich,Präsens_du,"Präsens_er, sie, es",Präteritum_ich,Partizip II,Konjunktiv II_ich,Imperativ Singular,Imperativ Plural,Hilfsverb
3,3796784,sein,"","",bin,bist,ist,war,gewesen,wäre,sei,seid,sein
8,1618550,haben,"","",habe,hast,hat,hatte,gehabt,hätte,habe,habt,haben
10,1379496,einen,"","",eine,einst,eint,einte,geeint,einte,eine,eint,haben
12,948246,werden,"","",werde,wirst,wird,wurde,geworden,würde,werde,werdet,sein
0 голосов
/ 20 апреля 2020

Какую Apache версию Spark вы используете? Опция кодирования доступна с 2.4.0, как вы можете видеть в официальных документах для 2.4.0 по сравнению с официальными документами для 2.3.4 .

. согласно документам, приведенным выше, вам не нужно устанавливать кодировку, если она UTF-8, учитывая, что на самом деле это кодировка по умолчанию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...