我正在尝试将数据帧的多个列从字符串转换为像这样的
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
我无法理解为什么会抛出这个错误
答案 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是您需要的数据框