2017-04-26 8 views
3

Der folgende Code fügt die doppelten Anführungszeichen nicht hinzu, was der Standardwert ist. Ich versuchte auch, # und einfaches Anführungszeichen hinzuzufügen, die Option quote mit keinem Erfolg verwendend. Ich verwendete auch quoteMode mit ALL und NON_NUMERIC Optionen, noch keine Änderung in der Ausgabe.So speichern Sie CSV mit allen Feldern in Anführungszeichen?

s2d.coalesce(64).write 
    .format("com.databricks.spark.csv") 
    .option("header", "false") 
    .save(fname) 

Gibt es noch andere Optionen, die ich ausprobieren kann? Ich benutze Spark-CSV 2.11 über Funken 2.1.

Output es produziert:

d4c354ef,2017-03-14 16:31:33,2017-03-14 16:31:46,104617772177,340618697 

Output Ich suche:

“d4c354ef”,”2017-03-14 16:31:33”,”2017-03-14 16:31:46”,104617772177,340618697 

Antwort

2

tl; dr Aktivieren Sie quoteAll Option.

scala> Seq(("hello", 5)).toDF.write.option("quoteAll", true).csv("hello5.csv") 

Die obige Abbildung zeigt die folgende Ausgabe:

$ cat hello5.csv/part-00000-a0ecb4c2-76a9-4e08-9c54-6a7922376fe6-c000.csv 
"hello","5" 

Das ist die quote geht davon wird " (siehe CSVOptions)

Das aber Sie werden nicht geben „doppelte Anführungszeichen um alle nicht- numerische Zeichen. " Entschuldigung.

Sie können alle Optionen in CSVOptions sehen, die als Quelle der Optionen für den CSV Reader und Writer dient.

p.s. com.databricks.spark.csv ist derzeit ein einfacher Alias ​​für csv Format. Sie können beide austauschbar verwenden, aber die kürzere csv ist bevorzugt.

p.s. Verwenden Sie option("header", false) (false als Boolean nicht String), die Ihren Code etwas typsicherer macht.

1

In Spark-2.1, wo die alte CSV Bibliothek inlined ist, ich sehe keine Möglichkeit, für das, was Sie wollen in der csv Methode von DataFrameWriter wie gesehen here.

Also ich denke, Sie müssen Ihre Daten "manuell" zuordnen, um zu bestimmen, welche der Komponenten sind keine Nummern und zitieren sie entsprechend.

def isNumeric(s: String) = s.nonEmpty && s.forall(Character.isDigit) 

Wie Sie über Ihre DataSet, geben die Werte der Karte, wo isNumericfalse ist: Man könnte eine einfache isNumeric Helfer Funktion wie diese nutzen.

+0

Danke. Aber ich verwende nicht die native Spark-Bibliothek. Ich benutze die Databricks Spark-CSV-Bibliothek. https://github.com/databricks/spark-csv –

+2

Ich weiß, dass Sie sind, aber Sie sollten wechseln, weil es veraltet ist, wie sie bemerken. Außerdem sind sie nicht zwei verschiedene Dinge. Die Funktionalität wurde in Spark absorbiert und Ihre Frage zeigt, warum Sie wechseln sollten. Hilfe zu veralteten Bibliotheken zu bekommen, wird immer schwieriger. – Vidya

+0

es ist nur quoteAll traurig ist verfügbar in spark 2.1. Ich stehe vor einem ähnlichen Problem, wo ich 'quoteMode' in Spark 2 brauche – ajkl

Verwandte Themen