Как переименовать столбцы в Apache Spark

Встречались ли с ситуациями, когда имя столбца в 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) в Москве:

Записаться на курс

Смотреть раcписание

Источники
  1. withColumnRenamed

Добавить комментарий

Поиск по сайту