繁体   English   中英

Spark-Scala 中的枢轴缺失系列问题

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM