Python 获得前5个起点和终点

Python 获得前5个起点和终点,python,sql,pyspark,Python,Sql,Pyspark,我是spark和SQL的新手,我正在尝试做一些查询。目前,我有一个数据帧(df)和一组列,但我对我选择的4列感兴趣,它们看起来像这样: Start Stop Price Distance 1 2 10 2 1 3 20 4 1 4 30 3 1 1 5 2 1 2 15 4 1 2

我是spark和SQL的新手,我正在尝试做一些查询。目前,我有一个数据帧(df)和一组列,但我对我选择的4列感兴趣,它们看起来像这样:

Start   Stop   Price  Distance
  1      2      10       2
  1      3      20       4
  1      4      30       3
  1      1      5        2
  1      2      15       4
  1      2      25       6
  2      1      10       3
  3      2      30       5
我需要的是通过两个点之间的行程数找到前5个起点和终点。如果存在平局,则平局破坏者是另一列价格率,由两个地点之间的平均价格计算得出。所以答案应该像下面所示,其中4.166是(10+15+25)/(2+4+6)

到目前为止,我所做的是

df2 = df.withColumn('Price_rate', col('Price')/col('Distance'))  
df3 = df2.select(['Start','Stop','Price_rate'])\
         .orderBy(col("Price_rate").desc())\
         .groupBy("Start","Stop")\
         .count().orderBy(col('count).desc()) 
这肯定不行,因为我不是平均价格,而是按降序排序。我不知道如何调用查询,以便我可以聚合平均值,然后按计数分组。任何提示都会有帮助。我知道也有一些方法可以调用SQL查询,因此任何一种方法都会有所帮助。

您可以使用
.agg()
函数对以下内容进行分组和聚合:

from pyspark.sql import functions as F

df.groupBy("Start", "Stop").agg(F.count("*").alias("Count"), (F.sum("Price")/F.sum("Distance"))\
        .alias("Price_Rate")).orderBy(["Count", "Price_Rate"], ascending=False).show()

+-----+----+-----+------------------+                                           
|Start|Stop|Count|        Price_Rate|
+-----+----+-----+------------------+
|    1|   2|    3| 4.166666666666667|
|    1|   4|    1|              10.0|
|    3|   2|    1|               6.0|
|    1|   3|    1|               5.0|
|    2|   1|    1|3.3333333333333335|
|    1|   1|    1|               2.5|
+-----+----+-----+------------------+
您可以使用
.agg()
函数按分组和聚合:

from pyspark.sql import functions as F

df.groupBy("Start", "Stop").agg(F.count("*").alias("Count"), (F.sum("Price")/F.sum("Distance"))\
        .alias("Price_Rate")).orderBy(["Count", "Price_Rate"], ascending=False).show()

+-----+----+-----+------------------+                                           
|Start|Stop|Count|        Price_Rate|
+-----+----+-----+------------------+
|    1|   2|    3| 4.166666666666667|
|    1|   4|    1|              10.0|
|    3|   2|    1|               6.0|
|    1|   3|    1|               5.0|
|    2|   1|    1|3.3333333333333335|
|    1|   1|    1|               2.5|
+-----+----+-----+------------------+

非常感谢你。这让我明白了很多!非常感谢你。这让我明白了很多!