Условная фильтрация DataFrame в PySpark: сравнение колонок
Быстрый ответ
Чтобы отфильтровать DataFrame в PySpark с учётом нескольких условий, используйте логические операторы: &
(и), |
(или) и ~
(не), применяемые в методе .filter()
. Важно, чтобы каждое условие было обернуто в скобки, поскольку это обеспечивает правильный приоритет операций. Если пренебречь этим правилом, результаты могут оказаться неконсистентными или неверными.
Смотрите пример:
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.
Разделяем условия фильтрации
Если ваши условия фильтрации выглядят сложно, их можно разделить, применяя метод .filter()
многократно. Это повышает читабельность кода и упрощает отладку. Такой подход лучше, поскольку Python обрабатывает каждое условие пошагово, последовательно.
Классический синтаксис SQL
Как альтернативу можно использовать классический синтаксис SQL внутри filter()
, который предоставляет возможность формулирования условий фильтрации в привычной форме.
Пример использования синтаксиса SQL для фильтрации:
# Фильтруем данные DataFrame с применением классического синтаксиса SQL
filtered_df = df.filter("column1 > 10 AND column2 = 'value' AND column3 IS NOT NULL")
Работа с методами pyspark.sql.functions
Возможности pyspark.sql.functions
расширяют набор доступных инструментов для фильтрации данных. Например, метод isin()
полезен для проверки вхождения значения столбца в указанный список.
Вот так можно использовать метод isin()
:
from pyspark.sql.functions import col
values_list = ['value1', 'value2', 'value3']
# Применяем метод 'isin' для отбора данных соответственно списку значений
filtered_df = df.filter(col("column2").isin(values_list))
Если нужно исключить некоторые значения, используется оператор ~
:
# Применяем 'NOT IN' для исключения значений из списка
filtered_df = df.filter(~col("column2").isin(values_list))
Работаем с null и NaN
При обработке значений null и NaN следует быть точным, чтобы гарантировать аккуратность данных. Функции isNull()
и isnan()
помогут отфильтровать подобные значения.
Пример работы с null и NaN:
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 соответствует вашим ожиданиям. Это поможет предотвратить нежелательные сюрпризы при работе с данными.
Полезные материалы
- Сложные методы фильтрации в PySpark — всё о фильтрации DataFrame на Medium.
- Написание эффективного кода на PySpark — полезные рекомендации по работе с PySpark.
- Официальный репозиторий Apache Spark на GitHub — исходный код для примеров и изучения.
- Обсуждения о фильтрации DataFrame в PySpark на Stackoverflow — место обмена опытом с другими пользователями PySpark.