dato i seguenti PySpark dataframeCome sottrarre una colonna di giorni da una colonna di date in Pyspark?
df = sqlContext.createDataFrame([('2015-01-15', 10),
('2015-02-15', 5)],
('date_col', 'days_col'))
Come può la colonna giorni sottratto dal colonna della data? In questo esempio, la colonna risultante dovrebbe essere ['2015-01-05', '2015-02-10']
.
Ho esaminato pyspark.sql.functions.date_sub()
, ma richiede una colonna di date e un solo giorno, ovvero date_sub(df['date_col'], 10)
. Idealmente, preferirei fare date_sub(df['date_col'], df['days_col'])
.
Ho provato anche la creazione di un'UDF:
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'])
funziona questo tecnicamente, ma ho letto che mettendosi tra Spark e Python può causare problemi di prestazioni per grandi insiemi di dati. Per ora posso restare con questa soluzione (non c'è bisogno di ottimizzare prematuramente), ma il mio istinto dice che ci deve essere un modo per fare questa cosa semplice senza usare una UDF Python.
Se non ti interessa digitare SQL puoi in realtà semplificarlo con 'df.select (expr (" date_sub ({0}, {1}) ". Format (" date_col "," days_col ")))' che rende è banale da comporre. – zero323