Используя pyspark, вы можете сделать что-то вроде следующего:
from pyspark.sql.functions import expr
df.withColumn('h', expr('split(hours, "[-:]")').astype('array<int>')) \
.withColumn('h1', expr('''
h[2] - h[0] + IF(h[2]<h[0],24,0) + round((h[3]-h[1])/60,0)
''').astype('int')) \
.show()
+----------+-----------+----------------+---+
| bdate| hours| h| h1|
+----------+-----------+----------------+---+
|2019-10-17| 9:0-0:0| [9, 0, 0, 0]| 15|
|2019-10-18|17:30-21:30|[17, 30, 21, 30]| 4|
+----------+-----------+----------------+---+
Сначала используйте набор символов [-:]
, чтобы разбить столбец hours
на массив из 4 элементов (названный h
) иприведите его к массиву int
(первоначально массив StringType)
Затем выполните простую математическую процедуру и в конце приведите тип результата к int
снова.
Далее используйте date_format('bdate', 'EEEE')
чтобы получить название недели, а затем использовать groupby
и pivot
и, возможно, agg
+ sum
функции, чтобы получить окончательный результат