scala - 如何取消旋转大型 Spark 数据框?
问题描述
unpivot
当列数相当低并且列名可以硬编码时,我已经看到了一些火花数据帧的解决方案。您是否有一个可扩展的解决方案来取消旋转具有大量列的数据框?
下面是一个玩具问题。
输入:
val df = Seq(
(1,1,1,0),
(2,0,0,1)
).toDF("ID","A","B","C")
+---+--------+----+
| ID| A | B | C |
+---+--------+-----
| 1| 1 | 1 | 0 |
| 2| 0 | 0 | 1 |
+---+----------+--+
预期结果:
+---+-----+-----+
| ID|names|count|
+---+-----------|
| 1| A | 1 |
| 1| B | 1 |
| 1| C | 0 |
| 2| A | 0 |
| 2| B | 0 |
| 2| C | 1 |
+---+-----------+
该解决方案应该适用于具有 N 列要取消透视的数据集,其中 N 很大(例如 100 列)。
解决方案
这应该可行,我假设您知道要取消透视的列列表
import org.apache.spark.sql.{functions => func, _}
val df = Seq(
(1,1,1,0),
(2,0,0,1)
).toDF("ID","A","B","C")
val cols = Seq("A", "B", "C")
df.select(
$"ID",
func.explode(
func.array(
cols.map(
col =>
func.struct(
func.lit(col).alias("names"),
func.col(col).alias("count")
)
): _*
)
).alias("v")
)
.selectExpr("ID", "v.*")
推荐阅读
- vba - 在 VBA 中查找和替换代码
- java - 如何获取 FixedPool 中线程的编号 (ID)?
- reactjs - 当 ref 回调参数在反应中为 NULL 时?
- parsing - Rebol/Red 解析:如何在 2 个标记之间复制
- angular - 错误 TS2339:类型“{}”上不存在属性“hometeam”
- hadoop - 爬取完成后,我们在哪里可以通过nutch的网络爬取找到数据?
- apache-kafka - 如何将 kubernetes 服务端点 IP 传递到 KAFKA 广告监听器
- angularjs - 在 ng-class 中使用 innerHTML 传递函数
- javascript - 您如何从 JavaScript 的深层对象中获取结果?
- mirc - 用于在客户列表中查找完全匹配的 Mirc 脚本