2017-12-13 2 views
2

Ich arbeite an einer großen Datei, die eines der Felder im Format mmddyy hat mit String als Datentyp und ich muss es in YYYY-MM-DD konvertieren. Ich habe versucht, UDF zu erstellen und auf einen der Post aber seinen Wurffehler zu konvertieren. Beispielcode:Pyspark - Konvertieren mmddyy in YYYY-MM-DD

Actual Feld in Datenrahmen:

+-----------+ 
|DATE_OPENED| 
+-----------+ 
|  072111| 
|  090606| 

Erwartete Ausgabe:

+---------------+ 
| DATE_OPENED| 
+---------------+ 
|  2011-07-21| 
|  2006-06-09| 

Beispielcode:

func = udf (lambda x: datetime.strptime(x, '%m%d%Y'), DateType()) 

newdf = olddf.withColumn('open_dt' ,date_format(func(col('DATE_OPENED')) , 'YYYY-MM-DD')) 

Fehler:

Error : ValueError: time data '072111' does not match format '%m%d%Y' 
+0

Siehe meine aktualisierte Antwort. Es verwendet eine Standardmethode zur Lösung des Problems, ohne auf eine UDF angewiesen zu sein. – Shaido

Antwort

3

Ich konnte es lösen, ohne ein udf zu erstellen, ich habe auf einen ähnlichen Beitrag (pyspark substring and aggregation) auf Stapel verwiesen und es hat einfach perfekt funktioniert.

from pyspark.sql.functions import * 
format = 'mmddyy' 
col = unix_timestamp(df1['DATE_OPENED'], format).cast('timestamp') 
df1 = df1.withColumn("DATE_OPENED", col) 

df2 = df.withColumn('open_dt', df['DATE_OPENED'].substr(1, 11)) 
+1

Sie sollten sich nicht auf 'substr' verlassen. Sie können 'from_unitime' verwenden, um ein Format anzugeben. https://spark.apache.org/docs/2.2.0/api/java/org/apache/spark/sql/functions.html#from_unitime-org.apache.spark.sql.Column-java.lang.String- –

0

Dies ist möglich, ohne sich auf eine langsame zu verlassen. Analysieren Sie stattdessen die Daten mit unix_timestamp, indem Sie das richtige Format angeben. Dann werfen Sie die Spalte DateType dem Sie das Format, das Sie standardmäßig möchten geben (yyyy-mm-dd):

df.withColumn('DATE_OPENED', unix_timestamp('DATE_OPENED','mmddyy').cast(DateType())) 

Wenn Sie Spark-Version haben 2.2+ gibt es eine noch bequemere Methode, to_date:

df.withColumn('DATE_OPENEND', to_date('DATE_OPENED','mmddyy')) 
Verwandte Themen