Marco de datos Pyspark convertir varias columnas a flotar

Estoy tratando de convertir varias columnas de un dataframe de una cadena a flotar como esta

df_temp = sc.parallelize([("1", "2", "3.4555"), ("5.6", "6.7", "7.8")]).toDF(("x", "y", "z")) df_temp.select(*(float(col(c)).alias(c) for c in df_temp.columns)).show() 

pero estoy recibiendo el error

 select() argument after * must be a sequence, not generator 

No puedo entender por qué se está lanzando este error

float() no es una función de Spark, necesitas la función cast() :

 df_temp.select(*(col(c).cast("float").alias(c) for c in df_temp.columns)) 

Si desea convertir algunas columnas sin cambiar todo el dataframe, puede hacerlo mediante la función Columna :

 for col_name in cols: df = df.withColumn(col_name, col(col_name).cast('float')) 

esto convertirá el tipo de columnas en la lista de columnas y mantendrá otras columnas como están.
Nota :
La función withColumn se usa para reemplazar o crear una nueva columna basada en el nombre de la columna;
si el nombre de la columna existe, será reemplazado, de lo contrario se creará

Aquí hay otro enfoque sobre cómo hacerlo:

 cv = [] # list of columns you want to convert to Float cf = [] # list of columns you don't want to change l = ['float(x.'+c+')' for c in cv] cst = '('+','.join(l)+')' l2 = ['x.'+c for c in cf] cst2 = '('+','.join(l2)+')' df2rdd = df.map(lambda x : eval(cst2)+eval(cst)) df_output = sqlContext.createDataFrame(df2rdd,df.columns) 

df_output es su dataframe requerido