列转行(宽表转窄表)
from pyspark.sql import functions as F
def 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
代码演示
行转列(窄表转宽表)