Встречались ли с ситуациями, когда имя столбца в PySpark неправильно написано или содержит пробелы, а вы хотели бы его переименовать? Тогда эта статья для вас. Мы расскажем, как переименовать обычные столбцы и вложенные различными способами.
Исходная таблица
Допустим имеется таблица, которая показана ниже. Мы использовали StructType
для того, чтобы создать вложенные столбцы. Их также можно будет переименовывать, но об этом чуть позже.
from pyspark.sql.types import StructField, StructType, StringType, IntegerType data = [ (('Tom','','Cruise'), '1991-04-01', 3000), (('John','Stone',''), '2000-05-19', 4000), (('Robert','','Williams'), '1978-09-05', 4000), (('Jack','Louise','Ford'), '1967-12-01', 4000), (('Anne','Rose','Brown'), '1980-02-17', 1500) ] schema = StructType([ StructField('name', StructType([ StructField('first name', StringType()), StructField('middle name', StringType()), StructField('last name', StringType()) ])), StructField('birth date', StringType()), StructField('annual salary', IntegerType()) ]) df = spark.createDataFrame(data, schema) """ +--------------------+----------+-------------+ | name|birth date|annual salary| +--------------------+----------+-------------+ | [Tom, , Cruise]|1991-04-01| 3000| | [John, Stone, ]|2000-05-19| 4000| |[Robert, , Williams]|1978-09-05| 4000| |[Jack, Louise, Ford]|1967-12-01| 4000| | [Anne, Rose, Brown]|1980-02-17| 1500| +--------------------+----------+-------------+ """
В этой таблице есть два столбца с пробельным символом. Неудобство такого имени заключается в том, что нельзя применять точечную нотацию. Так, нельзя написать: df.birth date
. Можно оставить такие имена, но тогда придется использовать синтаксис SQL, о котором говорили здесь.
1. Переименование столбцов в PySpark с помощью withColumnRenamed
Самый первый способ переименования столбцов в PySpark является метод withColumnRenamed
. Он принимает на вход два параметра: имя старого столбца и имя нового. В большинстве случаев применяется именно этот метод.
Так, например, переименуем birth date
в income
:
df.withColumnRenamed('birth date', 'income') """ +----------------+----------+-------------+ | name|birth date|annual salary| +----------------+----------+-------------+ | [Tom, , Cruise]|1991-04-01| 3000| +----------------+----------+-------------+ """
Стоит помнить, что создается новая таблица, а не изменяется старая. Если старая не нужна, то переприсовойте переменную.
2. Переименование нескольких столбцов с помощью withColumnRenamed
Код курса
GRAS
Ближайшая дата курса
по запросу
Продолжительность
ак.часов
Стоимость обучения
0 руб.
Часто приходится переименовывать именно несколько столбцов, но метод withColumnRenamed
принимает всего два параметра. Поэтому для того чтобы переименовать несколько столбцов сразу можно вызывать этот метод друг за другом.
Код ниже демонстрирует переименование столбца birth date
в dob
(date of birth) и annual salary
в income
.
df = df.withColumnRenamed('birth date', 'dob') \ .withColumnRenamed('annual salary', 'income') """ +--------------------+----------+------+ | name| dob|income| +--------------------+----------+------+ |[Robert, , Williams]|1978-09-05| 4000| +--------------------+----------+------+ """
3. Использование PySpark StructType для переименования вложенных столбцов
В нашей таблице столбец name
сам состоит из трех столбцов. Каждый из них содержит пробельный символ, поэтому лучше всего это также переименовать. Через метод show
не увидеть результат изменений, но зато printSchema
покажет новую схему.
schema_new = StructType([ StructField('fname', StringType()), StructField('mname', StringType()), StructField('lname', StringType()) ]) df = df.withColumn('name', F.col('name').cast(schema_new)) df.printSchema() """ root |-- name: struct (nullable = true) | |-- fname: string (nullable = true) | |-- mname: string (nullable = true) | |-- lname: string (nullable = true) |-- dob: string (nullable = true) |-- income: integer (nullable = true) """
Теперь можно обращаться к подстолбцам так: df.name.fname
. например, выбор одного столбца с фамилиями выглядит следующим образом:
df.select(df.name.lname).show() """ +----------+ |name.lname| +----------+ | Cruise| | | | Williams| | Ford| | Brown| +----------+ """
4. Как вынести вложенные столбцы и переименовать их в PySpark
Возможно, нам нужно и вовсе вынести вложенные столбцы, тогда доступ к ним будет осуществляться намного проще. В этом случае стоит использовать обычный метод withColumn
. Правда, тогда придется выбросить старый столбец с именами. Код для вынесения вложенных столбцов и последующее их переименование в PySpark:
import pyspark.sql.functions as F df = df.withColumn("fname", F.col("name.first name")) \ .withColumn("mname", F.col("name.middle name")) \ .withColumn("lname", F.col("name.last name")) \ .drop("name") """ +----------+------+------+------+--------+ | dob|income| fname| mname| lname| +----------+------+------+------+--------+ |1991-04-01| 3000| Tom| | Cruise| |2000-05-19| 4000| John| Stone| | |1978-09-05| 4000|Robert| |Williams| |1967-12-01| 4000| Jack|Louise| Ford| |1980-02-17| 1500| Anne| Rose| Brown| +----------+------+------+------+--------+ """
О том, как переименовывать и преобразовывать столбцы в PySpark вы узнаете на наших образовательных курсах в лицензированном учебном центре обучения и повышения квалификации руководителей и ИТ-специалистов (менеджеров, архитекторов, инженеров, администраторов, Data Scientist’ов и аналитиков Big Data) в Москве:
- Анализ данных с Apache Spark
- Машинное обучение в Apache Spark
- Графовые алгоритмы в Apache Spark
- Потоковая обработка в Apache Spark
- Основы Apache Spark для разработчиков