Python Pyspark dataframe将多列转换为浮点

Python Pyspark dataframe将多列转换为浮点,python,apache-spark,pyspark,Python,Apache Spark,Pyspark,我正在尝试将数据帧的多列从字符串转换为如下所示的浮点值 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() 但是我得到了错误 select() argument after * must be a sequence

我正在尝试将数据帧的多列从字符串转换为如下所示的浮点值

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()
但是我得到了错误

select() argument after * must be a sequence, not generator
我无法理解为什么会抛出此错误

float()
不是Spark函数,您需要函数
cast()


以下是另一种方法:

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_输出是您所需的数据帧

如果您希望在不更改整个数据帧的情况下强制转换某些列,您可以通过withColumn功能执行此操作:

for col_name in cols:
    df = df.withColumn(col_name, col(col_name).cast('float'))
这将强制转换cols列表中列的类型,并保持其他列不变。
注意

withColumn用于根据列名称替换或创建新列的函数
如果列名存在,它将被替换,否则它将被创建

需要pyspark.sql.functions导入col我在哪里可以了解有关此语法的更多信息(col(c).cast(“float”)。df_temp.columns中c的别名(c)?这里的“for”语句是在施法动作之后出现的。它有效,但非常缓慢。是否有更好的方法将所有列强制转换为float类型?
for col_name in cols:
    df = df.withColumn(col_name, col(col_name).cast('float'))