没有聚合的 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中进行内部连接?

Spark:数据帧聚合(Scala)

参考另一个数组列的 Spark 数据帧聚合

将 spark 数据帧聚合转换为 SQL 查询; window、groupby 的问题,以及如何聚合?

Spark:在scala中的数据帧上使用动态过滤器进行聚合