You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Scala Apache Toree环境下如何将void类长表转置为metric_name为列的宽表

实现方案

你当前的需求是典型的Spark DataFrame行转列(长表转宽表)场景,使用Spark内置的pivot算子即可快速实现,以下是可直接在Apache Toree - Scala环境运行的代码:

方式1:DataFrame API实现(更简洁)

该方式无需提前知道metric_name的所有取值,Spark会自动遍历生成对应列:

// 假设你的源结构化数据对应的DataFrame变量名为src_df
val pivotResult = src_df
  .groupBy("dt_analysis")
  .pivot("metric_name")
  // 因每个dt_analysis+metric_name组合仅对应一个值,可直接取第一个值即可
  .agg(first("mean_value"))

// 打印转置后的结果
pivotResult.show()

方式2:Spark SQL实现(性能更优)

如果提前知道所有metric_name的取值,手写SQL的方式可跳过Spark对metric_name的全局去重遍历步骤,执行效率更高:

// 先将源DF注册为临时视图,可直接用SQL查询
src_df.createOrReplaceTempView("metric_raw")

val pivotResult = spark.sql("""
SELECT
  dt_analysis,
  MAX(IF(metric_name = 'FID', mean_value, NULL)) AS FID,
  MAX(IF(metric_name = 'CLS', mean_value, NULL)) AS CLS,
  MAX(IF(metric_name = 'LCP', mean_value, NULL)) AS LCP
FROM metric_raw
GROUP BY dt_analysis
""")

// 打印转置后的结果
pivotResult.show()

转置后结果示例

dt_analysisFIDCLSLCP
2021-08-13337.075222293121840.477847955866484927853.39253624655
2021-08-14119.079276833236280.49335219461029631503.4752384264077
2021-08-15NULLNULL1654.1969758061045

注:Apache Toree内核默认已完成SparkSession初始化,变量spark可直接调用,上述代码无需额外配置即可运行。

内容的提问来源于stack exchange,提问作者Chrissie M.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 23:54:03