2016-10-06 3 views
1

Wie sollte ich Datum Zeit Parsing mit Spark 2.0 Dataset API richtig durchführen?Spark DataSet Datum Zeit Parsing

Es gibt viele Proben für Datenrahmen/RDD wie

eine Klasse wie

case class MyClass(myField:java.sql.Datetime) 

val mynewDf = spark.read 
    .option("header", "true") 
    .option("inferSchema", "true") 
    .option("charset", "UTF-8") 
    .option("delimiter", ",") 
    .csv("pathToFile.csv") 
    .as[MyClass] 

Ist nicht genug, um den Typ zu werfen. Wie soll ich das mit der Datensatz-API richtig machen?

bearbeiten

das Laden der Daten funktioniert. Z.B. ein print schema zeigt myDateFiled: timestamp (nullable = true) Aber ein myDf.show führt zu einer

java.lang.IllegalArgumentException 
     at java.sql.Date.valueOf(Date.java:143) 

, die mich führen zu glauben, dass meine Analyse der Daten falsch war. Wie kann das sein?

+1

Entschuldigung, es ist mir nicht wirklich klar, was Sie hier erreichen wollen und was Ihr Problem ist. Können Sie uns ein Beispiel der Eingabedatei zeigen und ein bisschen Ihre Frage aufführen? – cheseaux

+0

Wahrscheinlich sollte umformuliert werden: wie man eine explizite Umwandlung für Datensätze durchführt. –

+0

@cheseaux Bitte beachten Sie auch die Klarstellung in der neuesten Bearbeitung –

Antwort

4

Eine korrekte Darstellung eines Zeitstempel ist java.sql.Timestamp so Klasse sollte als

case class MyClass(myField: java.sql.Timestamp) 

mit coressponding Daten definiert werden:

myField 
"2016-01-01 00:00:03" 

Wenn diese Bedingungen erfüllt sind alles, was Sie tun müssen, ist Schema zu schaffen, :

spark.read 
    .options(Map("header" -> "true")) 
    .schema(StructType(Seq(StructField("myField", TimestampType, false)))) 
    .csv(...) 
    .as[MyClass] 

Alternative ist möglich e Datumsformat mit dateFormat mit SimpleDateFormat string.

Schema-Definition kann vor .as[MyClass] mit Typ-Casting ersetzt:

spark.read 
    .options(Map("header" -> "true")) 
    .csv(...) 
    .withColumn("myField", $"myField".cast("timestamp")) 
    .as[MyClass] 

Für DateType Verwendung java.sql.Date.