Python 获得前5个起点和终点
我是spark和SQL的新手,我正在尝试做一些查询。目前,我有一个数据帧(df)和一组列,但我对我选择的4列感兴趣,它们看起来像这样: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
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|
+-----+----+-----+------------------+
非常感谢你。这让我明白了很多!非常感谢你。这让我明白了很多!