2017-10-25 7 views
1

ich die folgenden CSV-Dateien gerade lese:Scala Funkendatenrahmen halten führende Nullen

id,hit,name 
0001,00000,foo 
0002,00001,bar 
0003,00150,toto 

Als Funkendatenrahmen mit einem SqlContext, die den Ausgang geben:

+--+---+----+ 
|id|hit|name| 
+--+---+----+ 
|1 |0 |foo | 
|2 |1 |bar | 
|3 |150|toto| 
+--+---+----+ 

Ich brauche das, was zu halten Nullen im Dataframe. Ich habe versucht, mit der Option "allowNumericLeadingZeros" auf True festgelegt, es funktioniert nicht. Ich habe einige Posts gesehen, die sagen, dass es ein Excel-Problem ist, aber mein Problem ist, dass die führenden Nullen innerhalb des Dataframes entfernt werden.

Wie kann ich die führenden Nullen im Dataframe behalten?

Danke!

+1

arbeitet für Ihren Fall lpad? Hier ist der Dokumentations-Link: https://spark.apache.org/docs/2.2.0/api/java/org/apache/spark/sql/functions.html#lpad-org.apache.spark.sql.Column- int-java.lang.String- –

+0

Danke für den schnellen asnwer, ich habe es gerade mit lpad versucht und es funktioniert, aber ich bin mir nicht sicher, es ist der "richtige" Weg, es zu tun, auf diese Weise füge ich nur 0. Ist es nicht besser, wenn ich den csv korrekt mit allen führenden 0 lese? – Drakax

Antwort

1

öffentlichen Datensatz csv (String ... Pfade)

Lädt eine CSV-Datei und gibt das Ergebnis als Datenrahmen. Diese Funktion wird die Eingabe einmal durchlaufen, um das Eingabeschema zu ermitteln, wenn inferSchema aktiviert ist. Um zu vermeiden, dass Sie die gesamten Daten einmal durchlaufen müssen, deaktivieren Sie die Option inefSchema oder geben Sie das Schema explizit mithilfe des Schemas an.

Sie können folgende CSV-spezifische Optionen festlegen mit CSV-Dateien umgehen:

  • September (Standard): setzen die einzelne Zeichen als Trennzeichen für jedes Feld und Wert.

  • Codierung (Standard UTF-8): Dekodiert die CSV-Dateien mit dem angegebenen Codierungstyp.

  • quote (default "): Legt das einzelne Zeichen fest, das zum Ableiten von Werten in Anführungszeichen verwendet wird. Das Trennzeichen kann Teil des Werts sein. Wenn Sie Angebote deaktivieren möchten, müssen Sie nicht null, sondern eine leere Zeichenfolge festlegen. Dieses Verhalten unterscheidet Form com.databricks.spark.csv

  • escape (Standard):. die einzelnen Zeichensätze verwendet für Anführungszeichen innerhalb eines bereits notierten Wert entweichende

  • Kommentar (default leere Zeichenkette). Sätze das einzelne Zeichen, das zum Überspringen von Zeilen verwendet wird, die mit diesem Zeichen beginnen Standardmäßig ist es deaktiviert

  • header (default false): Verwendet die erste Zeile als Namen von Spalten.

  • inferSchema (Standardwert false): leitet das Eingabeschema automatisch von den Daten ab. Es erfordert einen zusätzlichen Durchlauf über die Daten.

  • ignoreLeadingWhiteSpace (default false): bestimmt, ob oder ob nicht die führenden Leerzeichen von Werten & Lesen übersprungen werden soll.
  • ignoreTrailingWhiteSpace (default false): legt fest, ob oder nicht Hinter Leerzeichen aus Werten & Lesen übersprungen werden soll.

  • nullValue (leere Standardzeichenfolge): Legt die Zeichenfolgendarstellung eines Nullwerts fest. Seit 2.0.1 gilt dies für alle unterstützten Typen einschließlich des Zeichenfolgentyps.

  • nanValue (default NaN): stellt die Stringdarstellung einer nicht-number“ positiveInf Wert (default Inf.):. Die Stringdarstellung eines positiven infinity Wert setzt

  • negativeInf (default -Inf): stellt die Zeichenfolgendarstellung eines negativen Unendlichkeitswerts ein

  • dateFormat (Standard JJJJ-MM-TT): Legt die Zeichenfolge fest, die ein Datumsformat angibt Benutzerdefinierte Datumsformate folgen den Formaten unter java.text.SimpleDateFormat gilt für den Datumstyp

  • timestampFormat (Standard JJJJ-MM-TT'T'HH: mm: ss.SSSZZ): Legt die Zeichenfolge fest, die ein Zeitstempelformat angibt. Benutzerdefinierte Datumsformate folgen den Formaten von java.text.SimpleDateFormat. Dies gilt für den Zeitstempeltyp.

  • java.sql.Timestamp.valueOf() und java.sql.Date.valueOf() oder ISO 8601-Format. maxColumns (Standard 20480): Definiert eine feste Grenze für die Anzahl der Spalten, die ein Datensatz haben kann.

  • maxCharsPerColumn (Standard 1000000): Definiert die maximale Anzahl von Zeichen, die für einen bestimmten gelesenen Wert zulässig sind.

  • maxMalformedLogPerPartition (Standard 10): Legt die maximale Anzahl ungültiger Zeilen fest, die Spark für jede Partition protokolliert. Fehlerhafte Datensätze über diese Nummer hinaus werden ignoriert.

  • Modus (Standard PERMISSIVE): Ermöglicht einen Modus für den Umgang mit beschädigten Datensätzen während der Analyse.

  • PERMISSIVE: setzt andere Felder auf null, wenn ein beschädigter Datensatz gefunden wird. Wenn ein Schema vom Benutzer festgelegt wird, wird NULL für zusätzliche Felder festgelegt.

  • DROPMALFORMED: ignoriert die gesamten beschädigten Datensätze. FAILFAST: löst eine Ausnahme aus, wenn die beschädigten Datensätze gefunden werden.

Parameter:

Pfade - (undokumentiert)

Returns: (ohne Papiere) seit: 2.0.0

https://spark.apache.org/docs/2.0.1/api/java/org/apache/spark/sql/DataFrameReader.html

Beispiel:

val dataframe= sqlContext.read 
    .format("com.databricks.spark.csv") 
    .option("header", "true") // Use first line of all files as header 
    .option("inferSchema", "true") // Automatically infer data types 
    .load("/FileStore/tables/1wmfde6o1508943117023/Book2.csv") 

val selectedData = dataframe.select("id","hit","name") 

Ergebnis:

+---+---+----+ 
| id|hit|name| 
+---+---+----+ 
| 1| 0| foo| 
| 2| 1| bar| 
| 3|150|toto| 
+---+---+----+ 

Jetzt .option ändern ("InferSchema", "false")

val dataframe= sqlContext.read 
    .format("com.databricks.spark.csv") 
    .option("header", "true") // Use first line of all files as header 
    .option("inferSchema", "false") // Automatically infer data types 
    .load("/FileStore/tables/1wmfde6o1508943117023/Book2.csv") 

val selectedData = dataframe.select("id","hit","name") 

Ergebnis:

+----+-----+----+ 
| id| hit|name| 
+----+-----+----+ 
|0001|00000| foo| 
|0002|00001| bar| 
|0003|00150|toto| 
+----+-----+----+ 
+1

Sie haben den Header header auf false gesetzt, aber Sie haben inferSchema in false geändert, bitte schauen Sie einmal rein – prasad

+0

Das inferSchema = true hat mich falsch verstanden Danke, jetzt, dass inefeSchema falsch ist, es funktioniert! – Drakax

1

Sie müssen InferSchema gesetzt haben, wie wahr, während Datenrahmen zu lesen, diese Option entfernen oder es zu falschen

sparkSession.read.option("header","true").option("inferSchema","false").csv("path") 

Durch diese Option gesetzt, Funke das Schema der Datenrahmen ableiten und stellen datatype nach den gefundenen Werten, so Funke führt im Wesentlichen dazu, dass id und Treffer Spalten sind numerisch in der Natur und so entfernt es alle führenden Nullen.

Für weitere Unterstützung zu sehen this

1

Ich würde vorschlagen, dass Sie eine schema für Ihre dataframe zu erstellen und die Typen als String s definieren.

können Sie erstellen schema als

import org.apache.spark.sql.types._ 
val schema = StructType(Seq(StructField("id", StringType, true), StructField("hit", StringType, true), StructField("name", StringType, true))) 

und verwenden Sie es in sqlContext als

val df = sqlContext.read.option("header", true).schema(schema).format("com.databricks.spark.csv") 
    .csv("path to csv file") 

Wie andere Sie antwortete, dass der wahre Schuldige ist, dass Sie vielleicht .option("inferSchema", true) werden, der id und hit Spalten nimmt als integer s und führende 0 s werden entfernt.

So können Sie die CSV-Datei ohne .option("inferSchema", true) oder mit schema definiert lesen, wie oben

Ich hoffe, die Antwort hilfreich