В Pyspark есть все, что вы можете ожидать от любого SQL-движка. Тогда почему не оконная функция?
Сценарий
База данных банка содержит таблицу истории счетов, в которой хранится история каждой транзакции (вход в систему, выход из системы, кредит, дебет и т. д.) для всех банковских счетов. В этой таблице хранится несколько строк для каждого номера учетной записи, и, возможно, в один день также добавляется много строк для учетной записи. Дата и время транзакции хранятся в поле с именем ChangedDate. Статус счета меняется в любое время в зависимости от типа выполненной транзакции. Возможные значения состояния счета могут быть открыты для депозитов, открыты для платежей или закрыты.
Теперь задача состоит в том, чтобы получить последнюю запись с обновленным статусом для всех банковских счетов. Короче говоря, последний статус учетной записи с учетом самой последней транзакции, которая произошла на нем.
Первая проверка
В качестве первого шага давайте проверим количество записей, хранящихся для каждой учетной записи, с помощью группировки по функции. В результате на счете № 1001 было 7 транзакций, на счете 1002 — всего три транзакции, а на счетах 1003 и 1004 — всего одна транзакция. Теперь нам нужно получить последнюю транзакцию для каждой учетной записи.
Исходное решение
Давайте используем наш навык SQL и попробуем использовать его также в pyspark, где вы можете группировать записи с номером учетной записи, а затем выполнять функцию агрегирования, чтобы получить максимальное значение TransactionDateTime, как показано ниже.
Как видно, это решение не сработает. Это связано с тем, что когда вы выполняете группировку по номеру учетной записи, она удаляет другие отдельные поля из окончательного результата, и именно по этой причине вы видите ошибку, в которой отсутствует TransactionDateTime.
Окончательное решение
Оконная функция пришла сюда как спаситель. Он используется здесь для достижения нашей цели. Чтобы заставить его работать, вам нужно импортировать функцию Window из библиотеки pyspark.sql. Затем создайте окно по номеру счета, используя раздел (что-то похожее на groupBy). Затем создайте новую строку с максимальной датой транзакции. После этого поместите фрейм данных учетных записей поверх окна номера учетной записи. После создания отдельных окон для каждой учетной записи получите строку с максимальной датой транзакции. В конце удалите только что созданный столбец MaxTransactionDateTime, потому что он сейчас бесполезен.
Код ссылки
Краткое содержание
Здесь мы видели, как оконная функция упростила выполнение агрегированных функций над фреймом данных pyspark с несколькими условиями, а также смогла отобразить несколько строк.
#DataScience #PySpark #WindowFunction #AI #ML