¿Cómo cambiar el tipo de columna en PySpark Dataframe?

En este artículo, vamos a ver cómo cambiar el tipo de columna del marco de datos pyspark.

Creando dataframe para demostración:

Python

# Create a spark session
from pyspark.sql import SparkSession
spark = SparkSession.builder.appName('SparkExamples').getOrCreate()
  
# Create a spark dataframe
columns = ["Name", "Course_Name",
           "Duration_Months",
           "Course_Fees", "Start_Date",
           "Payment_Done"]
data = [
    ("Amit Pathak", "Python", 3,
     10000, "02-07-2021", True),
    ("Shikhar Mishra", "Soft skills",
     2, 8000, "07-10-2021", False),
    ("Shivani Suvarna", "Accounting",
     6, 15000, "20-08-2021", True),
    ("Pooja Jain", "Data Science", 12,
     60000, "02-12-2021", False),
]
course_df = spark.createDataFrame(data).toDF(*columns)
  
# View the dataframe
course_df.show()

Producción:

Veamos el esquema de dataframe:

Python

# View the column datatypes
course_df.printSchema()

Producción:

Método 1: Usar DataFrame.withColumn()

DataFrame.withColumn(colName, col) devuelve un nuevo DataFrame agregando una columna o reemplazando la columna existente que tiene el mismo nombre.

Haremos uso del método cast(x, dataType) para convertir la columna a un tipo de datos diferente. Aquí, el parámetro «x» es el nombre de la columna y dataType es el tipo de datos en el que desea cambiar la columna respectiva.

Ejemplo 1: cambiar el tipo de datos de columnas individuales.

Python

# Cast Course_Fees from integer type to float type
course_df2 = course_df.withColumn("Course_Fees", 
                                  course_df["Course_Fees"]
                                  .cast('float'))
course_df2.printSchema()

Producción:

root
 |-- Name: string (nullable = true)
 |-- Course_Name: string (nullable = true)
 |-- Duration_Months: long (nullable = true)
 |-- Course_Fees: float (nullable = true)
 |-- Start_Date: string (nullable = true)
 |-- Payment_Done: boolean (nullable = true)

En el ejemplo anterior, podemos observar que el tipo de datos de la columna «Course_Fees» se cambia a flotante desde largo. 

Ejemplo 2: cambiar el tipo de datos de varias columnas.

Python

# We can also make use of datatypes from 
# pyspark.sql.types
from pyspark.sql.types import StringType, DateType, FloatType
  
course_df3 = course_df \
  .withColumn("Course_Fees" ,
              course_df["Course_Fees"]
              .cast(FloatType()))   \
  .withColumn("Payment_Done",
              course_df["Payment_Done"]
              .cast(StringType()))    \
  .withColumn("Start_Date"  ,
              course_df["Start_Date"]
              .cast(DateType())) \
  
course_df3.printSchema()

Producción:

root
 |-- Name: string (nullable = true)
 |-- Course_Name: string (nullable = true)
 |-- Duration_Months: long (nullable = true)
 |-- Course_Fees: float (nullable = true)
 |-- Start_Date: date (nullable = true)
 |-- Payment_Done: string (nullable = true)

En el ejemplo anterior, cambiamos el tipo de datos de las columnas «Course_Fees», «Payment_Done» y «Start_Date» a «float», «str» ​​y «datetype» respectivamente.

Método 2: Usar DataFrame.select()

Aquí usaremos la función select(), esta función se usa para seleccionar las columnas del marco de datos

Sintaxis: dataframe.select(columnas)

Donde dataframe es el dataframe de entrada y las columnas son las columnas de entrada

Ejemplo 1: Cambiar una sola columna.

Convirtamos el `course_df3` de la estructura del esquema anterior, de vuelta al esquema original.

Python

from pyspark.sql.types import StringType, BooleanType, IntegerType
  
course_df4 = course_df3.select(
    course_df3.Name,
    course_df3.Course_Name,
    course_df3.Duration_Months,
    (course_df3.Course_Fees.cast(IntegerType()))
    .alias('Course_Fees'),
    (course_df3.Start_Date.cast(StringType()))
    .alias('Start_Date'),
    (course_df3.Payment_Done.cast(BooleanType()))
    .alias('Payment_Done'),
)
  
course_df4.printSchema()

Producción:

root
 |-- Name: string (nullable = true)
 |-- Course_Name: string (nullable = true)
 |-- Duration_Months: long (nullable = true)
 |-- Course_Fees: integer (nullable = true)
 |-- Start_Date: string (nullable = true)
 |-- Payment_Done: boolean (nullable = true)

Ejemplo 2: cambiar varias columnas al mismo tipo de datos.

Python

# Changing datatype of all the columns
# to string type
from pyspark.sql.types import StringType
  
course_df5 = course_df.select(
  [course_df.cast(StringType())
   .alias(c) for c in course_df.columns]
)
course_df5.printSchema()

Producción:

root
 |-- Name: string (nullable = true)
 |-- Course_Name: string (nullable = true)
 |-- Duration_Months: string (nullable = true)
 |-- Course_Fees: string (nullable = true)
 |-- Start_Date: string (nullable = true)
 |-- Payment_Done: string (nullable = true)

Ejemplo 3: cambiar varias columnas a los diferentes tipos de datos.

Usemos `course_df5` que tiene todo el tipo de columna como `string`. Cambiaremos los tipos de columna a un formato respectivo.

Python

from pyspark.sql.types import (
    StringType, BooleanType, IntegerType, FloatType, DateType
)
  
coltype_map = {
    "Name": StringType(),
    "Course_Name": StringType(),
    "Duration_Months": IntegerType(),
    "Course_Fees": FloatType(),
    "Start_Date": DateType(),
    "Payment_Done": BooleanType(),
}
  
# course_df6 has all the column
# types as string
course_df6 = course_df5.select(
    [course_df5.cast(coltype_map)
     .alias(c) for c in course_df5.columns]
)
course_df6.printSchema()

Producción:

root
 |-- Name: string (nullable = true)
 |-- Course_Name: string (nullable = true)
 |-- Duration_Months: integer (nullable = true)
 |-- Course_Fees: float (nullable = true)
 |-- Start_Date: date (nullable = true)
 |-- Payment_Done: boolean (nullable = true)

Método 3: Usar spark.sql()

Aquí usaremos tipo.

Sintaxis: spark.sql(“Consulta sql”)

Ejemplo: uso de spark.sql()

Python

# course_df5 has all the column datatypes as string
course_df5.createOrReplaceTempView("course_view")
  
course_df7 = spark.sql('''
SELECT 
  Name,
  Course_Name,
  INT(Duration_Months),
  FLOAT(Course_Fees),
  DATE(Start_Date),
  BOOLEAN(Payment_Done)
FROM course_view
''')
  
course_df7.printSchema()

Producción:

root
 |-- Name: string (nullable = true)
 |-- Course_Name: string (nullable = true)
 |-- Duration_Months: integer (nullable = true)
 |-- Course_Fees: float (nullable = true)
 |-- Start_Date: date (nullable = true)
 |-- Payment_Done: boolean (nullable = true)

Publicación traducida automáticamente

Artículo escrito por apathak092 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *