Biorąc pod uwagę następujące PySpark DataFrameJak odjąć kolumnę dni od kolumny dat w Pyspark?
df = sqlContext.createDataFrame([('2015-01-15', 10),
('2015-02-15', 5)],
('date_col', 'days_col'))
Jak kolumna dni zostaną odjęte z kolumny dat? W tym przykładzie uzyskana kolumna powinna być ['2015-01-05', '2015-02-10']
.
Zajrzałem do pyspark.sql.functions.date_sub()
, ale wymaga to kolumny daty i jednego dnia, tj. date_sub(df['date_col'], 10)
. Najlepiej byłoby, gdybym zrobił date_sub(df['date_col'], df['days_col'])
.
Próbowałem też tworzenie 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'])
to technicznie działa, ale czytałem, że zwiększenie pomiędzy Spark i Python może powodować problemy z wydajnością dla dużych zbiorów danych. Mogę trzymać się tego rozwiązania na razie (nie ma potrzeby przedwczesnej optymalizacji), ale moje intuicje mówią, że musi istnieć sposób na zrobienie tej prostej rzeczy bez użycia UDF w Pythonie.
Jeśli nie masz nic przeciwko wpisywaniu kodu SQL, możesz to w prosty sposób uprościć do 'df.select (wyrażenie (" date_sub ({0}, {1}) ".format (" date_col "," days_col "))), co czyni błahe komponowanie. – zero323