对 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 scala 从数据集中的行中获取第一列的值