die folgende PySpark DatenrahmenWie subtrahiert man eine Spalte von Tagen von einer Datumsspalte in Pyspark?
df = sqlContext.createDataFrame([('2015-01-15', 10),
('2015-02-15', 5)],
('date_col', 'days_col'))
Bedenkt man, wie die Tage Spalte von der Datumsspalte abgezogen werden kann? In diesem Beispiel sollte die resultierende Spalte ['2015-01-05', '2015-02-10']
lauten.
Ich schaute in pyspark.sql.functions.date_sub()
, aber es erfordert eine Datumsspalte und einen einzigen Tag, d.h. date_sub(df['date_col'], 10)
. Im Idealfall würde ich lieber date_sub(df['date_col'], df['days_col'])
tun.
Ich habe auch versucht eine UDF zu erstellen:
from datetime import timedelta
def subtract_date(start_date, days_to_subtract):
return start_date - timedelta(days_to_subtract)
subtract_date_udf = udf(subtract_date, DateType())
df.withColumn('subtracted_dates', subtract_date_udf(df['date_col'], df['days_col'])
Diese technisch funktioniert, aber ich habe gelesen, dass zwischen Funken und Python Schritt Performance-Probleme für große Datensätze verursachen können. Ich kann jetzt bei dieser Lösung bleiben (keine Notwendigkeit, vorzeitig zu optimieren), aber mein Bauchgefühl sagt, dass es einfach eine Möglichkeit geben muss, diese einfache Sache zu tun, ohne eine Python-UDF zu verwenden.
Wenn es Ihnen nichts ausmacht, SQL zu schreiben, können Sie dies tatsächlich zu 'df.select (expr (" date_sub ({0}, {1}) ") vereinfachen. Format (" date_col "," days_col ")))' which macht es ist trivial zu komponieren. – zero323