Условная фильтрация DataFrame в PySpark: сравнение колонок

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Чтобы отфильтровать DataFrame в PySpark с учётом нескольких условий, используйте логические операторы: & (и), | (или) и ~ (не), применяемые в методе .filter(). Важно, чтобы каждое условие было обернуто в скобки, поскольку это обеспечивает правильный приоритет операций. Если пренебречь этим правилом, результаты могут оказаться неконсистентными или неверными.

Смотрите пример:

Python
Скопировать код
from pyspark.sql.functions import col

# Данный код фильтрует DataFrame 'df' на основании следующих условий: 
# 'column1' > 10, 'column2' должно быть равно "value", 'column3' не должно быть пустым
filtered_df = df.filter((col("column1") > 10) & (col("column2") == "value") & (~col("column3").isNull()))

# Выводим отфильтрованный DataFrame для проверки
filtered_df.show()

Обратите внимание, что ссылка на столбец — col("columnName") — должна обозначаться точно. Эта формула заведомо работает без сбоев в Python.

Кинга Идем в IT: пошаговый план для смены профессии

Разделяем условия фильтрации

Если ваши условия фильтрации выглядят сложно, их можно разделить, применяя метод .filter() многократно. Это повышает читабельность кода и упрощает отладку. Такой подход лучше, поскольку Python обрабатывает каждое условие пошагово, последовательно.

Классический синтаксис SQL

Как альтернативу можно использовать классический синтаксис SQL внутри filter(), который предоставляет возможность формулирования условий фильтрации в привычной форме.

Пример использования синтаксиса SQL для фильтрации:

Python
Скопировать код
# Фильтруем данные DataFrame с применением классического синтаксиса SQL
filtered_df = df.filter("column1 > 10 AND column2 = 'value' AND column3 IS NOT NULL")

Работа с методами pyspark.sql.functions

Возможности pyspark.sql.functions расширяют набор доступных инструментов для фильтрации данных. Например, метод isin() полезен для проверки вхождения значения столбца в указанный список.

Вот так можно использовать метод isin():

Python
Скопировать код
from pyspark.sql.functions import col

values_list = ['value1', 'value2', 'value3']
# Применяем метод 'isin' для отбора данных соответственно списку значений
filtered_df = df.filter(col("column2").isin(values_list))

Если нужно исключить некоторые значения, используется оператор ~:

Python
Скопировать код
# Применяем 'NOT IN' для исключения значений из списка
filtered_df = df.filter(~col("column2").isin(values_list))

Работаем с null и NaN

При обработке значений null и NaN следует быть точным, чтобы гарантировать аккуратность данных. Функции isNull() и isnan() помогут отфильтровать подобные значения.

Пример работы с null и NaN:

Python
Скопировать код
from pyspark.sql.functions import isnan

# Исключаем строки с значениями null или NaN в 'column4'
filtered_df = df.filter((~col("column4").isNull()) & (~isnan("column4")))

Визуализация

Представьте DataFrame как таблицу, из которой вы хотите отобрать строки, удовлетворяющие определенным условиям. Ваша роль — находить и сохранять те строки, которые "распознаются" по вашим условиям.

Если исходной таблицей является: | Столбец A | Столбец B | Столбец C | |-----------|-----------|-----------| | 👍 | 🔒 | 💵 | | 👎 | 🔓 | 💵 | | 👍 | 🔓 | 💶 | | 👎 | 🔒 | 💶 |

При определении условий фильтрации таких:

  • Столбец A должен быть равен 👍.
  • Столбец B должен быть в состоянии 🔒,

то в результате отбора мы получим: | Столбец A | Столбец B | Столбец C | |-----------|-----------|-----------| | 👍 | 🔒 | 💵 |

следовательно, в окончательном наборе данных будут только записи, удовлетворяющие заданным условиям.

Избегаем ловушек и ошибок

Фильтрация с применением множественных условий требует точности, чтобы предотвратить ошибки, такие как неправильное расположение скобок. Следите за логикой своего кода, особенно при работе с булевыми выражениями.

Баланс производительности

Оценивайте эффективность ваших фильтров. Слишком длинные цепочки могут замедлить выполнение кода. Стремитесь установить баланс между чистотой кода и производительностью.

Отладка — ваше средство защиты

Не забывайте регулярно использовать .printSchema() в процессе отладки кода, чтобы убедиться, что структура DataFrame соответствует вашим ожиданиям. Это поможет предотвратить нежелательные сюрпризы при работе с данными.

Полезные материалы

  1. Сложные методы фильтрации в PySpark — всё о фильтрации DataFrame на Medium.
  2. Написание эффективного кода на PySpark — полезные рекомендации по работе с PySpark.
  3. Официальный репозиторий Apache Spark на GitHub — исходный код для примеров и изучения.
  4. Обсуждения о фильтрации DataFrame в PySpark на Stackoverflow — место обмена опытом с другими пользователями PySpark.