Конкатенация колонок в DataFrame через Spark SQL
Быстрый ответ
Для слияния колонок в DataFrame Apache Spark используйте функцию concat
из пакета pyspark.sql.functions
. Вот пример использования этой функции:
from pyspark.sql.functions import concat, col
# Предположим, что в DataFrame 'df' существуют колонки 'FirstName' и 'LastName'
df.select(concat(col("FirstName"), col("LastName")).alias("FullName")).show()
В результате будет создана новая колонка "FullName", в которой значения "FirstName" и "LastName" объединены. Одним словом, мы создали "звездный дуэт" в нашем DataFrame!
Учет разделителей
Если вы хотите добавить пробел между значениями, пользуйтесь функцией concat_ws
. Здесь ws означает "with separator" (с разделителем):
from pyspark.sql.functions import concat_ws, col
# Слияние с использованием пробела в качестве разделителя
df.select(concat_ws(" ", col("FirstName"), col("LastName")).alias("FullName")).show()
Символ пробела хорошо соединяет колонки, и это знает каждый, кто имел дело с ASCII-кодом 32!
Работа с NULL: не позволяйте отсутствующим значениям испортить ваш процесс
Данные не всегда бывают полными и могут содержать null
. Естественно, вы не хотите игнорировать этот факт, не так ли? Чтобы правильно объединить колонки, используйте функцию coalesce
или оцените условия с помощью when
и otherwise
:
from pyspark.sql.functions import coalesce, lit
df.withColumn("FullName", concat(coalesce(col("FirstName"), lit("")), coalesce(col("LastName"), lit(""))))
Null-значения преобразуются в пустые строки. Вот так решается проблема отсутствующих данных!
Определение пользовательской функции: когда вам не хватает встроенных функций
Если стандартных функций оказывается недостаточно, можно создать пользовательскую функцию (User Defined Function, UDF):
from pyspark.sql.functions import udf
from pyspark.sql.types import StringType
def custom_concat(a, b):
# Здесь вы можете определить свою логику
return a.strip() + " " + b.strip()
concat_udf = udf(custom_concat, StringType())
df.withColumn("FullName", concat_udf(col("FirstName"), col("LastName")))
Поздравляю! Вы взяли инициативу в свои руки (или, лучше сказать, в свою функцию)!
Визуализация
Представьте колонки вашего DataFrame как бусы, нанизанные на нитку:
Колонка A (FirstName): [John, Jane, Mike]
Колонка B (LastName): [Doe, Roe, Pike]
После слияния получится:
Результат (FullName): [JohnDoe, JaneRoe, MikePike]
Или, если выразиться кодом:
df.withColumn("FullName", concat(col("FirstName"), col("LastName")))
Результат: ⚡ Нам удалось успешно объединить 'FirstName' и 'LastName' в одну колонку 'FullName'!
Погружение в объединение в Spark
Использование selectExpr
для упрощения кода
Этот подход позволяет использовать SQL-выражения для оптимизации вашего кода:
df.selectExpr("concat(FirstName, LastName) as FullName").show()
Таким образом, вы сокращаете количество кода, и ваш ответ на Stack Overflow становится лаконичнее!
Прямые SQL-запросы: новые приемы в старом SQL
Кто сказал, что в SQL нет места новшествам?
df.createOrReplaceTempView("people")
spark.sql("SELECT CONCAT(FirstName, LastName) AS FullName FROM people").show()
Вы можете писать SQL запросы прямо на Python, и, возможно, мы только что изобрели PySQL!
Интерполяция строк с помощью ||
Хитрость для объединения строковых столбцов:
df.selectExpr("FirstName || LastName as FullName").show()
Кто бы мог подумать, что пара вертикальных линий (||
) могут служить склейкой в SQL!
Полезные материалы
- Spark SQL, Built-in Functions – официальная документация по функциям DataFrame в Apache Spark.
- python – How to change dataframe column names in PySpark? – Stack Overflow – здесь можно найти множество полезных советов о трансформациях DataFrame, в том числе и о манипуляциях со столбцами в PySpark.
- Medium – подробный обзор работы с функциями столбцов в Apache Spark.
- Advanced Apache Spark Training – Sameer Farooqui (Databricks) – бесплатное видео, полный курс по освоению Apache Spark продолжительностью восемь часов.
- [[SPARK-26021]](https://issues.apache.org/jira/browse/SPARK-26021) – задача в JIRA, актуальная для поведения функций в Apache Spark, отражает текущие тенденции развития в сфере открытого исходного кода.