Pyspark数据帧将多个列转换为浮点数

时间:2016-11-08 02:31:25

标签: 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, not generator

我无法理解为什么会抛出这个错误

3 个答案:

答案 0 :(得分:10)

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

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

答案 1 :(得分:6)

如果要投射某些列而不更改整个数据框架,则可以通过 withColumn 函数来实现:

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

这将强制转换cols列表中的列类型,并保留其他列。
注意
withColumn 函数用于根据列名替换或创建新列;
如果存在列名,它将被替换,否则将被创建

答案 2 :(得分:-2)

以下是另一种方法:

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是您需要的数据框