Spark DataFrame转换:如何将df_metrics_1转为df_metrics_2?
Spark宽表转窄表:从df_metrics_1到df_metrics_2的转换方法
要将宽格式的df_metrics_1转换为窄格式的df_metrics_2,可以使用Spark SQL的stack函数实现,这是Spark中处理宽表转长表的常用方式。
转换代码实现
# 原始数据定义 df_metrics_1 = spark.createDataFrame([(1,2.0,3.0,1.0, 4.0 ,"A"), (4, 2.0,2.0,2.0, 1.0, "A"), (7,5.0,8.0,5.0, 6.0, "B")], ["id", "mae_modelA", "mae_modelB", "mse_modelA", "mse_modelB", "class"]) # 核心转换逻辑 df_metrics_2 = df_metrics_1.selectExpr( "id", "class", "stack(2, 'modelA', mae_modelA, mse_modelA, 'modelB', mae_modelB, mse_modelB) as (model_nm, mae, mse)" ).select("class", "model_nm", "id", "mae", "mse") # 查看转换结果 df_metrics_2.show(truncate=False)
代码说明
stack函数:- 第一个参数
2表示将每行数据拆分为2行(对应modelA和modelB两个模型)。 - 后续参数按
模型名、mae值、mse值的顺序成对传入,对应宽表中mae_modelA/mse_modelA、mae_modelB/mse_modelB两组列。 as (model_nm, mae, mse)为拆分后生成的三列指定名称。
- 第一个参数
- 调整列顺序:通过
select函数重新排列列的顺序,与目标表df_metrics_2的列顺序一致。
输出结果
转换后的表与目标表结构完全一致(注:目标表中mobelB应为笔误,转换结果中已修正为modelB):
+-----+--------+---+---+---+ |class|model_nm|id |mae|mse| +-----+--------+---+---+---+ |A |modelA |1 |2.0|1.0| |A |modelB |1 |3.0|4.0| |A |modelA |4 |2.0|2.0| |A |modelB |4 |2.0|1.0| |B |modelA |7 |5.0|5.0| |B |modelB |7 |8.0|6.0| +-----+--------+---+---+---+
内容的提问来源于stack exchange,提问作者377_yc
相关产品推荐
相关产品推荐

