没有聚合的 Spark 数据帧枢轴
Posted
技术标签:
【中文标题】没有聚合的 Spark 数据帧枢轴【英文标题】:Spark dataframe pivot without aggregation 【发布时间】:2020-06-30 18:37:34 【问题描述】:我是 spark 新手,目前正在尝试在不聚合的情况下从行到列进行数据透视,就像我需要在数据透视后复制数据一样。
我有如下数据
+----+----------+--------+
|abc |col |position|
+----+----------+--------+
|1234|183500000X|0 |
|1234|0202211120|1 |
|1234|VA |2 |
|1234|Y |3 |
|1234|183500000X|0 |
|1234|21174 |1 |
|1234|NC |2 |
|1234|N |3 |
|1234|null |0 |
|1234|null |1 |
|1234| |2 |
|1234| |3 |
|1234|null |0 |
|1234|null |1 |
|1234| |2 |
|1234| |3 |
我想把它改成下面的格式
+----------+----------+----------+---+---+
| abc | 0| 1| 2| 3|
+----------+----------+----------+---+---+
|1234 |183500000X|0202211120| VA| Y|
|1234 |183500000X|21174 | NC| N|
+----------+----------+----------+---+---+
每当我尝试使用 df.groupBy($"abc").pivot("position").agg(first($"col"))
时……我只得到一条记录而不是全部。
有没有办法在不聚合的情况下获取所有记录。
我是否需要加入另一个数据框来提取数据.. 请同样建议我。
【问题讨论】:
更新了答案。你也需要做点什么。 如果可以申请合适的分组,那么请采纳答案。 【参考方案1】:import org.apache.spark.sql.functions._
val df = spark.sparkContext.parallelize(Seq(
("A", "1", "0", 1),
("A", "2", "1", 1),
("A", "VA", "2", 1),
("A", "7", "3", 1),
("A", "11", "0", 2),
("A", "22", "1", 2),
("A", "VAVA", "2", 2),
("A", "77", "3", 2),
("B", "1", "0", 3),
("B", null, "1", 3)
)).toDF("abc", "col", "position", "grouping")
val result = df.groupBy("abc", "grouping")
.pivot("position")
.agg(expr("first(col)"))
.drop("grouping")
result.show()
+---+---+----+----+----+
|abc| 0| 1| 2| 3|
+---+---+----+----+----+
| A| 1| 2| VA| 7|
| A| 11| 22|VAVA| 77|
| B| 1|null|null|null|
+---+---+----+----+----+
除了空值方面,您需要通过以某种方式向数据添加分组编号来执行以下操作。这就是线索。这是一个数据争论的练习。我不太了解您的数据,无法提供建议。
支持说明
问题是分组看起来是连续的,我们不知道是否总是有 4 个或 N 个集合。我们如何应用这样的分组?您通常需要一组适当的分组键,但我们这里似乎没有。 Spark 在这类事情上不太擅长,我们需要保持位置,即使使用 zipWithIndex 这也是一项艰巨的任务。
事实上,问题不仅仅是 .pivot。
【讨论】:
嗨,感谢您的回答。我认为这不足以满足我的回答,因为该小组只会为每家公司提供一条记录……但是从我的问题来看,我也应该能够得到重复。 这是一个指南,而不是实际答案。 可以,但我似乎记得这里有一个问题 感谢您的逻辑,我尝试添加一个“withColumn”列作为 groupColumn 提供给 group by...请让我知道这里有什么问题 除非 4 组,否则很难分组以上是关于没有聚合的 Spark 数据帧枢轴的主要内容,如果未能解决你的问题,请参考以下文章
Scala Spark - 如何减少在单列中包含多列的数据帧?
如何通过不同级别的枢轴聚合然后在pyspark中进行内部连接?