Это моя вторая работа с использованием Spark, и мне было интересно, можно ли было избежать подобных операций.
Мой сценарий: у меня есть таблица строк, и я хотел бы повернуть эту таблицу, чтобы вместо нее были столбцы строк. После этого я хочу выполнить некоторые агрегации, чтобы узнать максимальные значения и вернуть новый вывод.
Я написал код, который работает и выглядит так:
df_inbound = df \
.where(col("event_type").isin(['task.created', 'task.completed', 'task.canceled']))\
.withColumn("event_type", regexp_replace(col("event_type"), "\.", "_")) \
.groupBy(
"event_data.task_sid",
"task_attributes.call_sid") \
.pivot("event_type") \
.agg(first(to_timestamp("event_date"))) \
.groupBy(
"task_sid",
"call_sid") \
.agg(
mx("task_created").alias("task_created"),
mx("task_completed").alias("task_completed"),
mx("task_canceled").alias("task_canceled"),
) \
.withColumn("call_ended", coalesce(col("task_canceled"), col("task_completed"))) \
.select(
col("task_sid"),
col("call_sid"),
col("call_ended"),
(col("call_ended").cast("long") - col("task_created").cast("long")).alias("total_call_time")
)
Возможно избежать нескольких groupBy или aggr? Или это нормальное поведение при использовании Spark?