Вот упрощенная версия других ответов, использующих встроенные функции массива в Spark 2.4 +.
Сначала разбейте строку дат, чтобы получить массив. Теперь, поскольку даты уже отсортированы, используйте функцию element_at
, чтобы получить первые и последние даты, поскольку, когда индекс отрицателен, он обращается к элементам массива от последнего к первому. Остальные просто вычисляют datediff
и делят его на размер массива, чтобы получить среднее значение:
df.withColumn("array_dates", split(col("date"), "[|]"))\
.withColumn("total_time", datediff(element_at("array_dates", -1), element_at("array_dates", 1))) \
.withColumn("average_time", col("total_time") / size(col("array_dates"))) \
.drop("array_dates")\
.show(2, False)
#+------------------------------------------------------+----------+------------+
#|date |total_time|average_time|
#+------------------------------------------------------+----------+------------+
#|2018-08-01|2017-06-01|2015-11-01|2012-08-21|2010-04-02|3043 |608.6 |
#|2016-08-11|2013-08-25|2013-04-01|2012-01-01 |1684 |421.0 |
#+------------------------------------------------------+----------+------------+
Если даты в строке не упорядочены, как в вашем Например, вы можете отсортировать массив после разделения, используя array_sort