Especifique múltiples cambios de tipo de datos de columnas a diferentes tipos de datos en pyspark

Tengo un DataFrame ( df ) que consta de más de 50 columnas y diferentes tipos de datos, como

 df3.printSchema() CtpJobId: string (nullable = true) |-- TransformJobStateId: string (nullable = true) |-- LastError: string (nullable = true) |-- PriorityDate: string (nullable = true) |-- QueuedTime: string (nullable = true) |-- AccurateAsOf: string (nullable = true) |-- SentToDevice: string (nullable = true) |-- StartedAtDevice: string (nullable = true) |-- ProcessStart: string (nullable = true) |-- LastProgressAt: string (nullable = true) |-- ProcessEnd: string (nullable = true) |-- ClipFirstFrameNumber: string (nullable = true) |-- ClipLastFrameNumber: double (nullable = true) |-- SourceNamedLocation: string (nullable = true) |-- TargetId: string (nullable = true) |-- TargetNamedLocation: string (nullable = true) |-- TargetDirectory: string (nullable = true) |-- TargetFilename: string (nullable = true) |-- Description: string (nullable = true) |-- AssignedDeviceId: string (nullable = true) |-- DeviceResourceId: string (nullable = true) |-- DeviceName: string (nullable = true) |-- srcDropFrame: string (nullable = true) |-- srcDuration: double (nullable = true) |-- srcFrameRate: double (nullable = true) |-- srcHeight: double (nullable = true) |-- srcMediaFormat: string (nullable = true) |-- srcWidth: double (nullable = true) 

Ahora quiero que todas las columnas de un tipo se puedan cambiar de una sola vez, como

 timestamp_type = [ 'PriorityDate', 'QueuedTime', 'AccurateAsOf', 'SentToDevice', 'StartedAtDevice', 'ProcessStart', 'LastProgressAt', 'ProcessEnd' ] integer_type = [ 'ClipFirstFrameNumber', 'ClipLastFrameNumber', 'TargetId', 'srcHeight', 'srcMediaFormat', 'srcWidth' ] 

Sé cómo hacerlo uno por uno como lo estoy haciendo ahora.

 df3 = df3.withColumn("PriorityDate", df3["PriorityDate"].cast(TimestampType())) df3 = df3.withColumn("QueuedTime", df3["QueuedTime"].cast(TimestampType())) df3 = df3.withColumn("AccurateAsOf", df3["AccurateAsOf"].cast(TimestampType()) df3= df3.withColumn("srcMediaFormat", df3["srcMediaFormat"].cast(IntegerType())) df3= df3.withColumn("DeviceResourceId", df3["DeviceResourceId"].cast(IntegerType())) df3= df3.withColumn("AssignedDeviceId", df3["AssignedDeviceId"].cast(IntegerType())) 

Pero esto parece feo y fácilmente puedo perder cualquier columna que quiera cambiar. ¿Hay alguna manera de que pueda escribir cualquier función que se ocupe del mismo tipo de lista de columnas que cambiar? Por lo tanto, puedo implementar fácilmente convert_data_type y pasar los nombres de esas columnas. Gracias por adelantado

En lugar de enumerar todos sus valores, debe usar un bucle:

 for c in timestamp_type: df3 = df3.withColumn(c, df[c].cast(TimestampType())) for c in integer_type: df3 = df3.withColumn(c, df[c].cast(IntegerType())) 

O de forma equivalente, puede utilizar functools.reduce :

 from functools import reduce # not needed in python 2 df3 = reduce( lambda df, c: df.withColumn(c, df[c].cast(TimestampType())), timestamp_type, df3 ) df3 = reduce( lambda df, c: df.withColumn(c, df[c].cast(IntegerType())), integer_type, df3 )