我有一个示例数据集,如下所示。
+---------+--------+---------+---------+---------+
| 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 |
+---------+--------+---------+---------+---------+
有可能产生这种火花吗?怎样才能达到相同的目的?
答案 0 :(得分:1)
使用least
和greatest
计算三列中的最小值和最大值,然后对其进行排序。在 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|
+-------+------+-------+-------+-------+