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'))