对 Spark DataFrame 中第一列的值形成的组中的其他列进行排序

Posted

技术标签:

【中文标题】对 Spark DataFrame 中第一列的值形成的组中的其他列进行排序【英文标题】:Sort other columns within the groups formed by the values of first column in Spark DataFrame 【发布时间】:2019-08-25 16:46:17 【问题描述】:

我想保持第一列的顺序(即 col a)不变(假设第一列总是默认排序)并且想要执行对其余列(col b 和 col c)在由第一列的值形成的组内(即 col a)使用 Spark Dataframe操作/strong>。

根据我的要求,我在下面提供了两个示例。

真正的问题是保持第一列(即 col a)的顺序不变,它不应该进行任何排序/排序操作。

我尝试了以下方法来获取输出,但这些方法不符合我的要求,因为我正在执行 orderBy 或第一列,这是不正确的。

    df.orderBy(col("a").desc(),col("b"),col("c")).show();

    df.orderBy(col("a").asc(),col("b"),col("c")).show();

输入 DF1:

+---+---+---+---+
|  a|  b|  c|  d|  
+---+---+---+---+
|  1|  2|  5|  3|
|  1|  7|  1|  9|
|  1|  6|  1|  8|
|  2|  5|  8|  3|
|  2|  6|  2|  7|
|  2|  9|  2|  7|
|  3|  4|  7|  4|
|  3|  1|  4|  2|
|  3|  3|  1|  9|
+---+---+---+---+

输出 DF1:

+---+---+---+---+
|  a|  b|  c|  d|
+---+---+---+---+
|  1|  2|  5|  3|
|  1|  6|  1|  8|
|  1|  7|  1|  9|
|  2|  5|  8|  3|
|  2|  6|  2|  7|
|  2|  9|  2|  7|
|  3|  1|  4|  2|
|  3|  3|  1|  9|
|  3|  4|  7|  4|
+---+---+---+---+

输入 DF2:

+---+---+---+---+
|  a|  b|  c|  d|
+---+---+---+---+
|  3|  4|  7|  4|
|  3|  1|  4|  2|
|  3|  3|  1|  9|
|  2|  5|  8|  3|
|  2|  6|  2|  7|
|  2|  9|  2|  7|
|  1|  2|  5|  3|
|  1|  7|  1|  9|
|  1|  6|  1|  8|
+---+---+---+---+

输出 DF2:

+---+---+---+---+
|  a|  b|  c|  d|
+---+---+---+---+
|  3|  1|  4|  2|
|  3|  3|  1|  9|
|  3|  4|  7|  4|
|  2|  5|  8|  3|
|  2|  6|  2|  7|
|  2|  9|  2|  7|
|  1|  2|  5|  3|
|  1|  6|  1|  8|
|  1|  7|  1|  9|
+---+---+---+---+

【问题讨论】:

不可能 抱歉,给出答案的问题的主旨是什么? 【参考方案1】:

这里是 Spark-2.4.3 用于检索预期输出的代码

scala> var df1 =spark.createDataFrame(Seq((1,2,5,3),(1,7,1,9),(1,6,1,8),(2,5,8,3),(2,6,2,7),(2,9,2,7),(3,4,7,4),(3,1,4,2),(3,3,1,9))).toDF("a","b","c","d")


scala> df1.show
+---+---+---+---+
|  a|  b|  c|  d|
+---+---+---+---+
|  1|  2|  5|  3|
|  1|  7|  1|  9|
|  1|  6|  1|  8|
|  2|  5|  8|  3|
|  2|  6|  2|  7|
|  2|  9|  2|  7|
|  3|  4|  7|  4|
|  3|  1|  4|  2|
|  3|  3|  1|  9|
+---+---+---+---+

对于 df1,您可以使用默认顺序(升序)按所有人排序

scala> df1.orderBy("a","b","c","d").show
+---+---+---+---+
|  a|  b|  c|  d|
+---+---+---+---+
|  1|  2|  5|  3|
|  1|  6|  1|  8|
|  1|  7|  1|  9|
|  2|  5|  8|  3|
|  2|  6|  2|  7|
|  2|  9|  2|  7|
|  3|  1|  4|  2|
|  3|  3|  1|  9|
|  3|  4|  7|  4|
+---+---+---+---+

scala> var df2 = spark.createDataFrame(Seq((3,4,7,4),(3,1,4,2),(3,3,1,9),(2,5,8,3),(2,6,2,7),(2,9,2,7),(1,2,5,3),(1,7,1,9),(1,6,1,8))).toDF("a","b","c","d")


scala> df2.show
+---+---+---+---+
|  a|  b|  c|  d|
+---+---+---+---+
|  3|  4|  7|  4|
|  3|  1|  4|  2|
|  3|  3|  1|  9|
|  2|  5|  8|  3|
|  2|  6|  2|  7|
|  2|  9|  2|  7|
|  1|  2|  5|  3|
|  1|  7|  1|  9|
|  1|  6|  1|  8|
+---+---+---+---+

对于 df2,您可以按 col("a") 降序和其他默认(升序)和默认顺序(升序)进行排序

scala> df2.orderBy(col("a").desc,col("b"),col("c"),col("d")).show

+---+---+---+---+
|  a|  b|  c|  d|
+---+---+---+---+
|  3|  1|  4|  2|
|  3|  3|  1|  9|
|  3|  4|  7|  4|
|  2|  5|  8|  3|
|  2|  6|  2|  7|
|  2|  9|  2|  7|
|  1|  2|  5|  3|
|  1|  6|  1|  8|
|  1|  7|  1|  9|
+---+---+---+---+

如果您有任何疑问,请告诉我。

【讨论】:

以上是关于对 Spark DataFrame 中第一列的值形成的组中的其他列进行排序的主要内容,如果未能解决你的问题,请参考以下文章

如何根据另一列的值从 Spark DataFrame 中选择特定列?

Spark DataFrame列的合并与拆分

无法使用 spark scala 从数据集中的行中获取第一列的值

求教: Spark的dataframe 怎么改列的名字,比如列名 SUM(_c1) 改成c1

DT::DataTables 中第一列的黑色背景和白色字体

如何根据火花DataFrame中另一列的值更改列的值