2017-12-17 4 views
2

Irgendeine Idee, warum ich das Ergebnis unten bekomme?Wie konvertiert man das benutzerdefinierte Datetime-Format in Timestamp?

scala> val b = to_timestamp($"DATETIME", "ddMMMYYYY:HH:mm:ss") 
b: org.apache.spark.sql.Column = to_timestamp(`DATETIME`, 'ddMMMYYYY:HH:mm:ss') 

scala> sourceRawData.withColumn("ts", b).show(6,false) 
+------------------+-------------------+-----------+--------+----------------+---------+-------------------+ 
|DATETIME   |LOAD_DATETIME  |SOURCE_BANK|EMP_NAME|HEADER_ROW_COUNT|EMP_HOURS|ts     | 
+------------------+-------------------+-----------+--------+----------------+---------+-------------------+ 
|01JAN2017:01:02:03|01JAN2017:01:02:03 | RBS  | Naveen |100    |15.23 |2017-01-01 01:02:03| 
|15MAR2017:01:02:03|15MAR2017:01:02:03 | RBS  | Naveen |100    |115.78 |2017-01-01 01:02:03| 
|02APR2015:23:24:25|02APR2015:23:24:25 | RBS  |Arun |200    |2.09  |2014-12-28 23:24:25| 
|28MAY2010:12:13:14| 28MAY2010:12:13:14|RBS  |Arun |100    |30.98 |2009-12-27 12:13:14| 
|04JUN2018:10:11:12|04JUN2018:10:11:12 |XZX  | Arun |400    |12.0  |2017-12-31 10:11:12| 
+------------------+-------------------+-----------+--------+----------------+---------+-------------------+ 

Ich versuche DATETIME- (die in DDMMMYY ist: HH: mm: ss-Format) zu konvertieren zu (die oben in der letzten Spalte dargestellt ist), aber es scheint nicht zu konvertieren Wert zu korrigieren . I bezeichnen die unten Post, aber keine Hilfe:

Better way to convert a string field into timestamp in Spark

Wer kann mir helfen?

+1

Betrachten Sie die Antwort, die am meisten bei der Lösung des Problems geholfen hat, siehe [hier] (https://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work) für mehr Informationen. – Shaido

Antwort

4

Verwenden y (Jahr) nicht Y (Woche Jahr):

spark.sql("SELECT to_timestamp('04JUN2018:10:11:12', 'ddMMMyyyy:HH:mm:ss')").show 
// +--------------------------------------------------------+ 
// |to_timestamp('04JUN2018:10:11:12', 'ddMMMyyyy:HH:mm:ss')| 
// +--------------------------------------------------------+ 
// |          2018-06-04 10:11:12| 
// +--------------------------------------------------------+ 
-1

Versuchen Sie, diese UDF:

val changeDtFmt = udf{(cFormat: String, 
         rFormat: String, 
         date: String) => { 
    val formatterOld = new SimpleDateFormat(cFormat) 
    val formatterNew = new SimpleDateFormat(rFormat) 
    formatterNew.format(formatterOld.parse(date)) 
}} 

sourceRawData. 
    withColumn("ts", 
    changeDtFmt(lit("ddMMMyyyy:HH:mm:ss"), lit("yyyy-MM-dd HH:mm:ss"), $"DATETIME")). 
    show(6,false) 
+0

was ist lit() Funktion in der obigen Antwort? – Arun

+2

Es gibt eine Standardfunktion für das Datumsformat, so dass keine benutzerdefinierte UDF benötigt wird. –

-1

Versuch unter Code

ich eine Probe Datenrahmen "df" erstellt haben, für die Tabelle

+---+-------------------+ 
| id|    date| 
+---+-------------------+ 
| 1| 01JAN2017:01:02:03| 
| 2| 15MAR2017:01:02:03| 
| 3|02APR2015:23:24:25 | 
+---+-------------------+ 
val t_s= unix_timestamp($"date","ddMMMyyyy:HH:mm:ss").cast("timestamp") 

df.withColumn("ts",t_s).show() 

+---+-------------------+--------------------+ 
| id|    date|     ts| 
+---+-------------------+--------------------+ 
| 1| 01JAN2017:01:02:03|2017-01-01 01:02:...| 
| 2| 15MAR2017:01:02:03|2017-03-15 01:02:...| 
| 3|02APR2015:23:24:25 |2015-04-02 23:24:...| 
+---+-------------------+--------------------+ 

Danke

Verwandte Themen