根据多于一列对数据集进行排序

时间:2018-07-03 13:57:51

标签: sorting apache-spark

我有一个示例数据集,如下所示。

+---------+--------+---------+---------+---------+
|  Col1   |  Col2  | NumCol1 | NumCol2 | NumCol3 |
+---------+--------+---------+---------+---------+
| Value 1 | Value2 |       6 |       2 |       9 |
| Value 3 | Value4 |       8 |       3 |      12 |
| Value 5 | Value6 |       1 |      11 |       8 |
| Value 7 | Value8 |       4 |      10 |       5 |
+---------+--------+---------+---------+---------+

我需要基于Column(NumCol1,NumCol2,NumCol3)的值对该数据集进行排序,即,如果我必须按升序对数据集进行排序,则需要得到以下结果。

+---------+--------+---------+---------+---------+
|  Col1   |  Col2  | NumCol1 | NumCol2 | NumCol3 |
+---------+--------+---------+---------+---------+
| Value 5 | Value6 |       1 |      11 |       8 |
| Value 1 | Value2 |       6 |       2 |       9 |
| Value 3 | Value4 |       8 |       3 |      12 |
| Value 7 | Value8 |       4 |      10 |       5 |
+---------+--------+---------+---------+---------+
具有Value 5 Value6 1 11 8

行排在第一位,因为它具有最低的 1 ,如下所示。

如果按降序排列,结果将是:

+---------+--------+---------+---------+---------+
|  Col1   |  Col2  | NumCol1 | NumCol2 | NumCol3 |
+---------+--------+---------+---------+---------+
| Value 3 | Value4 |       8 |       3 |      12 |
| Value 5 | Value6 |       1 |      11 |       8 |
| Value 7 | Value8 |       4 |      10 |       5 |
| Value 1 | Value2 |       6 |       2 |       9 |
+---------+--------+---------+---------+---------+

有可能产生这种火花吗?怎样才能达到相同的目的?

1 个答案:

答案 0 :(得分:1)

使用leastgreatest计算三列中的最小值和最大值,然后对其进行排序。在 pyspark 中:

升序的最小值:

import pyspark.sql.functions as f
df.orderBy(f.least(f.col('NumCol1'), f.col('NumCol2'), f.col('NumCol3'))).show()
+-------+------+-------+-------+-------+
|   Col1|  Col2|NumCol1|NumCol2|NumCol3|
+-------+------+-------+-------+-------+
|Value 5|Value6|      1|     11|      8|
|Value 1|Value2|      6|      2|      9|
|Value 3|Value4|      8|      3|     12|
|Value 7|Value8|      4|     10|      5|
+-------+------+-------+-------+-------+

下降的最大值:

df.orderBy(f.greatest(f.col('NumCol1'), f.col('NumCol2'), f.col('NumCol3')).desc()).show()
+-------+------+-------+-------+-------+
|   Col1|  Col2|NumCol1|NumCol2|NumCol3|
+-------+------+-------+-------+-------+
|Value 3|Value4|      8|      3|     12|
|Value 5|Value6|      1|     11|      8|
|Value 7|Value8|      4|     10|      5|
|Value 1|Value2|      6|      2|      9|
+-------+------+-------+-------+-------+