2017-05-17 6 views
3

Ich habe Daten wie folgt aus:Wie berechnet man den Datumsunterschied in pyspark?

df = sqlContext.createDataFrame([ 
    ('1986/10/15', 'z', 'null'), 
    ('1986/10/15', 'z', 'null'), 
    ('1986/10/15', 'c', 'null'), 
    ('1986/10/15', 'null', 'null'), 
    ('1986/10/16', 'null', '4.0')], 
    ('low', 'high', 'normal')) 

ich das Datum Unterschied zwischen low Spalte und 2017-05-02 und ersetzen low Spalte mit der Differenz berechnet werden soll. Ich habe verwandte Lösungen auf Stackoverflow versucht, aber keiner von ihnen funktioniert.

Antwort

7

Sie müssen die Spalte low in das Klassendatum umwandeln, und dann können Sie datediff() in Kombination mit lit() verwenden. Mit Spark-2.2:

from pyspark.sql.functions import datediff, to_date, lit 

df.withColumn("test", 
       datediff(to_date(lit("2017-05-02")), 
         to_date("low","yyyy/MM/dd"))).show() 
+----------+----+------+-----+ 
|  low|high|normal| test| 
+----------+----+------+-----+ 
|1986/10/15| z| null|11157| 
|1986/10/15| z| null|11157| 
|1986/10/15| c| null|11157| 
|1986/10/15|null| null|11157| 
|1986/10/16|null| 4.0|11156| 
+----------+----+------+-----+ 

Mit < Spark-2.2, müssen wir die die low Spalte Klasse timestamp zuerst konvertieren:

from pyspark.sql.functions import datediff, to_date, lit, unix_timestamp 

df.withColumn("test", 
       datediff(to_date(lit("2017-05-02")), 
         to_date(unix_timestamp('low', "yyyy/MM/dd").cast("timestamp")))).show() 
+0

Ich habe einen Fehler „Typeerror: to_date() nimmt genau 1 Argument (2 gegeben) " –

+0

Und was ist wenn Nan Wert in' Low' Spalte ist? –

+0

das ist, weil Sie Spark verwenden <2.2 – mtoto

Verwandte Themen