Spark, используя несколько групповых в одной цепочке. Как избежать? - PullRequest
1 голос
/ 27 февраля 2020

Это моя вторая работа с использованием 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?

1 Ответ

0 голосов
/ 27 февраля 2020

Если я правильно понимаю вашу формулировку проблемы из вашего примера, то, скорее всего, вместо использования first() в качестве сводной агрегации, просто использование max() приведет к желаемому результату (помогая избавиться от лишних groupBy() и agg()).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...