我的Spark数据帧中有1000列。我在下面有一个函数来逐个转换列类型。但我希望能够将所有列类型一次性转换为double类型。下面的代码一次只能用于一列。
def convertcolumn(df, name, new_type):
df_1 = df.withColumnRenamed(name, "swap")
return df_1.withColumn(name, df_1["swap"].cast(new_type)).drop("swap")
答案 0 :(得分:2)
您可以折叠列:
from functools import reduce
mapping = [("x", "double"), ("y", "integer")]
df = sc.parallelize([("1.0", "1", "foo")]).toDF(["x", "y", "z"])
reduce(lambda df, kv: convertcolumn(*(df, ) + kv), mapping, df)
或只是构建表达式列表和select
:
from pyspark.sql.functions import col
mapping_dict = dict(mapping)
exprs = [col(c).cast(mapping[c]) if c in mapping_dict else c for c in df.columns]
df.select(*exprs)