Python 限制每个不带循环的唯一pyspark dataframe列值返回的行数

Python 限制每个不带循环的唯一pyspark dataframe列值返回的行数,python,loops,dataframe,apache-spark,pyspark,Python,Loops,Dataframe,Apache Spark,Pyspark,我有一个简短的问题,希望有人能回答 是否可以在pyspark数据帧内限制某列中唯一值返回的结果量 例如,我有一个包含4列的数据框: +-------+------------------+--------------+-------------+ |partner|productId | mediumtype| prediction| +-------+------------------+--------------+-------------+ |7005410|

我有一个简短的问题,希望有人能回答

是否可以在pyspark数据帧内限制某列中唯一值返回的结果量

例如,我有一个包含4列的数据框:

+-------+------------------+--------------+-------------+
|partner|productId         |    mediumtype|   prediction|
+-------+------------------+--------------+-------------+
|7005410|               544|             1| 0.0026476993|
|7005410|               549|             2|-2.6975607E-4|
|7005410|               626|             3| 2.0409889E-4|
|7005410|               840|             2| 3.6301462E-5|
|7005410|              1192|             3| 2.2148499E-5|
+-------+------------------+--------------+-------------+
partner列有一个数值(在本例中为7005410)。在本例中,您看到5行具有唯一合作伙伴id,但实际上有7.000+个唯一合作伙伴id。这不仅对这个合作伙伴重要,而且对所有其他4.000+合作伙伴也重要,这意味着总共有7.000*4.000=28.000.000行


我希望它只为每个唯一的合作伙伴id获取前5个预测(限制(5))。到目前为止,我已将数据帧放入带有过滤器的循环中,但由于Spark的延迟加载特性,这需要花费大量时间才能完成,我想知道是否有一种方法可以对每个唯一的合作伙伴id应用限制(5)。

试试这个。在
窗口上取
行号()
并过滤掉
大于5的位置。考虑到数据已经排序,我们可以在窗口中按文本常量排序

from pyspark.sql import functions as F
from pyspark.sql.window import Window

w=Window().partitionBy("partner").orderBy(F.lit(1))

df.withColumn("rowNum", F.row_number().over(w))\
  .filter('rowNum<=5').drop("rowNum").show()
从pyspark.sql导入函数为F
从pyspark.sql.window导入窗口
w=Window().partitionBy(“合作伙伴”).orderBy(F.lit(1))
df.withColumn(“rowNum”,F.row_number()。在(w)上方)\

.filter('rowNumwhen你说前5个预测,你是按什么排序的?或者排序不重要吗?你只想要前5个?@MohammadMurtazaHashmi这些预测是通过执行orderBy(['partner','prediction',],升序=False)排序的。这意味着每个合作伙伴的最高预测总是排在第一位。因此,在这种情况下,排序并不重要,只返回每个唯一合作伙伴的前5行。不知道您可以col@Dee只需在其周围添加不同的引号来表示字符串,如
'col=“aa”
“col='aa'