Spark 2.4.0 Scala环境下144列DataFrame除指定列外批量转行如何实现?
实现方案
直接动态构造stack函数的入参即可实现,不需要手动编写143个列参数,代码如下:
import org.apache.spark.sql.functions.expr // 1. 过滤得到除dt外所有需要逆透视的列名 val unpivotCols = df.columns.filter(_ != "dt") // 2. 自动拼接stack函数的参数表达式 val stackExpr = s"stack(${unpivotCols.size}, ${unpivotCols.map(col => s"'$col', $col").mkString(", ")}) as (Head, Val)" // 3. 执行逆透视转换得到目标结果 val resultDF = df.select($"dt", expr(stackExpr))
注意事项
- 如果待转换的列数据类型不统一,建议先统一转换为同类型再处理,避免类型不兼容报错,例如统一转为String类型可以把表达式构造逻辑改为:
val stackExpr = s"stack(${unpivotCols.size}, ${unpivotCols.map(col => s"'$col', cast($col as string)").mkString(", ")}) as (Head, Val)" - 该方案直接使用Spark原生内置的
stack函数实现,底层经过Spark引擎优化,相比自定义UDF、RDDflatMap等实现方式性能更高,适合处理大数量级数据集。
内容的提问来源于stack exchange,提问作者Jhon
相关产品推荐
相关产品推荐

