在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_analysis | FID | CLS | LCP |
|---|---|---|---|
| 2021-08-13 | 337.07522229312184 | 0.4778479558664849 | 27853.39253624655 |
| 2021-08-14 | 119.07927683323628 | 0.4933521946102963 | 1503.4752384264077 |
| 2021-08-15 | NULL | NULL | 1654.1969758061045 |
注:Apache Toree内核默认已完成SparkSession初始化,变量
spark可直接调用,上述代码无需额外配置即可运行。
内容的提问来源于stack exchange,提问作者Chrissie M.
相关产品推荐
相关产品推荐

