2016-09-12 5 views
2

Ich versuche, eine CSV-Datei zu lesen, die Backslash verwendet, um Trennzeichen zu entkommen, anstatt Anführungszeichen zu verwenden. Ich habe versucht, den DataFrameReader ohne Qoutes und mit einem Escape-Zeichen zu erstellen, aber es funktioniert nicht. Es scheint, dass die "Escape" -Option nur verwendet werden kann, um Anführungszeichen zu umgehen. Gibt es einen anderen Weg, als ein benutzerdefiniertes Eingabeformat zu erstellen?Spark 2.0 Scala - Lesen von CSV-Dateien mit Escapezeichen

Hier sind die Optionen, die ich jetzt bin mit:

spark.read.options(Map(
    "sep" -> ",", 
    "encoding" -> "utf-8", 
    "quote" -> "", 
    "escape" -> "\\", 
    "mode" -> "PERMISSIVE", 
    "nullValue" -> "" 

Für das Beispiel lassen sagen, dass wir die folgenden Beispieldaten haben:

Schema: Name, Stadt

Joe Bloggs,Dublin\,Ireland 
    Joseph Smith,Salt Lake City\,\ 
    Utah 

Das sollte 2 Datensätze zurückgeben:

Name   |  City 
-----------------|--------------- 
Joe Bloggs  | Dublin,Ireland 
Joseph Smith  | Salt Lake City, 
Utah 

Die Möglichkeit, Zeilenumbrüche zu umgehen, wäre zwar wünschenswert, aber es ist erforderlich, das Spaltentrennzeichen zu umgehen. Im Moment denke ich darüber nach, die Zeilen mit spark.textFile zu lesen und dann eine CSV-Bibliothek zu verwenden, um die einzelnen Zeilen zu analysieren. Das behebt das Problem mit dem Escape-Spaltentrennzeichen, aber nicht mit den Zeilentrennzeichen.

+0

Können Sie ein Musterzeilenformat angeben? –

+0

Ich denke, Sie haben Recht, bitte [Check] (https://github.com/databricks/spark-csv/blob/master/src/main/scala/com/databricks/spark/csv/package.scala) –

+0

Beispiel Daten zur Frage hinzugefügt. –

Antwort

0

Es scheint, dass dies im CSV-Leser nicht unterstützt wird (siehe https://github.com/databricks/spark-csv/issues/390).

Ich rate, dass der einfachste Weg um dies ist, Ihre Zeilen manuell analysieren; gar nicht ideal aber immer noch funktional und nicht zu schwer.

Sie können Ihre Zeilen unter Verwendung eines negativen Lookbehind-Regex z. (?<!\\), - Dies entspricht jedem Komma, dem kein umgekehrter Schrägstrich vorangestellt ist.