如何一次转换多个Spark数据帧列类型?

时间:2016-02-12 01:53:43

标签: python apache-spark dataframe pyspark apache-spark-sql

我的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")

1 个答案:

答案 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)