[英]Pivot- Missing Series Issue in Spark-Scala
+-----------+----------+-----+
| M | Index|c1 |
+-----------+----------+-----+
|M1 | 0| 224|
|M1 | 1| 748|
|M1 | 3| 56|
+-----------+----------+-----+
我有一个像上面那样的 DF。 如果我使用 pivot - df.groupBy("M").pivot("Index").agg(first("c1"))
,我会得到如下所示的内容。但这意味着我在系列中缺少“2” . 但是,这可能很愚蠢但很棘手,有什么方法可以在执行枢轴时填充列系列
+-----------+----+---+---+
| M | 0| 1| 3|
+-----------+----+---+---+
|M1 |224 |748| 56|
+-----------+----+---+---+
期待结果
+-----------+----+---+---+--+
| M | 0| 1| 2|3 |
+-----------+----+---+---+---
|M1 |224 |748| 0 |56|
+-----------+----+---+---+--+
欢迎来到 SO @abc_spark,
假设您的表中没有太多索引,您可以尝试以下方法:这里我计算整个数据集的最大索引值。 然后对于从 0 到 maxIndex 的每个索引,我创建一个默认值 = 0 的列。注意我还用零填充空值。
import spark.implicits._
import org.apache.spark.sql.functions._
val df = Seq(
("M1", 0, 224),
("M1", 1, 748),
("M1", 3, 56),
("M2", 3, 213)
).toDF("M", "Index", "c1")
val pivoted = df.groupBy("M").pivot("Index").agg(first("c1")).na.fill(0)
val maxValue = df.select(max($"Index")).collect.head.getAs[Int](0)
val withAllCols = (0 to maxValue).foldLeft(pivoted){case (df, idx) =>
if(df.columns contains idx.toString) df
else df.withColumn(idx.toString, lit(0))
}
withAllCols.show(false)
+---+---+---+---+---+
|M |0 |1 |3 |2 |
+---+---+---+---+---+
|M2 |0 |0 |213|0 |
|M1 |224|748|56 |0 |
+---+---+---+---+---+
编辑:使用排序列:
withAllCols
.select("M", withAllCols.columns.filterNot(_ == "M").sortBy(_.toInt):_*)
.show(false)
+---+---+---+---+---+
|M |0 |1 |2 |3 |
+---+---+---+---+---+
|M2 |0 |0 |0 |213|
|M1 |224|748|0 |56 |
+---+---+---+---+---+
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.