当前位置: 首页 > 面试题库 >

在pyspark中检索每个DataFrame组中的前n个

澹台景山
2023-03-14
问题内容

pyspark中有一个DataFrame,其数据如下:

user_id object_id score
user_1  object_1  3
user_1  object_1  1
user_1  object_2  2
user_2  object_1  5
user_2  object_2  2
user_2  object_2  6

我期望在每个组中返回2条记录,每条记录具有相同的user_id,它们需要具有最高的得分。因此,结果应如下所示:

user_id object_id score
user_1  object_1  3
user_1  object_2  2
user_2  object_2  6
user_2  object_1  5

我真的是pyspark的新手,有人可以给我一个代码段或门户网站有关此问题的相关文档吗?万分感谢!


问题答案:

我相信您需要使用窗口函数基于user_id和来获得每一行的排名score,然后过滤结果以仅保留前两个值。

from pyspark.sql.window import Window
from pyspark.sql.functions import rank, col

window = Window.partitionBy(df['user_id']).orderBy(df['score'].desc())

df.select('*', rank().over(window).alias('rank')) 
  .filter(col('rank') <= 2) 
  .show() 
#+-------+---------+-----+----+
#|user_id|object_id|score|rank|
#+-------+---------+-----+----+
#| user_1| object_1|    3|   1|
#| user_1| object_2|    2|   2|
#| user_2| object_2|    6|   1|
#| user_2| object_1|    5|   2|
#+-------+---------+-----+----+

通常,官方编程指南是开始学习Spark的好地方。

数据

rdd = sc.parallelize([("user_1",  "object_1",  3), 
                      ("user_1",  "object_2",  2), 
                      ("user_2",  "object_1",  5), 
                      ("user_2",  "object_2",  2), 
                      ("user_2",  "object_2",  6)])
df = sqlContext.createDataFrame(rdd, ["user_id", "object_id", "score"])


 类似资料:
  • 我最近正在评估图形数据库或任何其他数据库的一个特定要求: 通过一个查询中节点的直接子节点及其所有直接和间接子节点的聚合属性检索每个节点的前n个子节点的能力。结果应返回正确的层次结构。 实例 < code >每个节点都有一个属性,即它有多少个直接子节点。并且该树不超过8层。假设我想运行整个树的查询,通过每个级别的所有节点,它的前2个子节点有最多的直接和间接子节点。它将为我们提供以下信息: 我想知道是

  • 问题内容: 我有一个简单的表,像这样: 我想获得每个用户出现的前2个“字母”, 甚至更好:崩溃成列 我怎样才能在postgres中做到这一点? 问题答案: = > SQL小提琴演示

  • 问题内容: 我试图从看起来像这样的数据库表结果中选择前2条记录 我试过这个查询 但是有些主题,例如失踪的地方,我什至尝试了以下链接的建议 如何选择每个组的前N行? 但是我为每个受检者得到两个以上 我究竟做错了什么? 问题答案: 您可以使用相关的子查询: 该查询通过串联三列来构造单列主键。如果您有真正的主键(如),则可以用代替。 SQL Fiddle中的示例。

  • 问题内容: 我有一个表格,我需要在其中获取每个类别的前n个最高金额的项目。 我期望的输出是前2个类别中的最高清单。 问题答案: 这应该为您工作。如果它不满足您的要求,请发回您需要的内容。您最初希望有25个,所以您只需将最后一个子句修改为 如果要从表中选择更多列,只需将它们添加到和“ GROUP BY”子句中。 仅当您要扩展“ 每个Category,foo,bar的TOP n ”时,才将这些列也添加

  • 我有一个包含以下[('列1',值),('列2',值),('列3',值),…,('列100',值)]的RDD。我想创建一个包含带有元组的单个列的数据框。 我得到的最接近的是: 然后 但这会产生一个包含列表列的数据帧,而不是元组。

  • 问题内容: 问题很多,但我似乎找不到与我遇到的情况相匹配的问题。我想在前n个查询中执行一些分组。我的数据看起来像这样(显然是假值)。 该表的日期范围涵盖数月,每月有数千行。我想做的是一个查询,告诉我哪个IP地址出现在每个月中最频繁。我可以使用以下方法完成一个月的操作: 但是我真正想要的是能够看到数据集中每个月的前n个。从本质上讲,这禁止了我使用我指定的where子句。当然,当我这样做的时候,我在所