from pyspark.sql import functions as Fdef unpivot(df, keys):# 参数说明 df dataframe keys 待转换表中需要保留的主键key,以list[]类型传入# 转换是为了避免字段类不匹配,统一将数据转换为string类型,如果保证数据类型完全一致,可以省略该句df = df.select(*[F.col(_).astype("string") for _ in df.columns])cols = [_ for _ in df.columns if _ not in keys]stack_str = ','.join(map(lambda x: "'%s', %s" % (x, x), cols))# feature, value 转换后的列名,可自定义df = df.selectExpr(*keys, "stack(%s, %s) as (feature, value)" % (len(cols), stack_str))return df