我几乎可以肯定这个问题以前被问过,但是通过stackoverflow搜索并没有回答我的问题。不是[2]的副本,因为我想要的是最大值,而不是最频繁的项。我是pyspark的新手,尝试做一些非常简单的事情:我想按列“a”分组,然后只保留列“b”中每个组的最大值行。这样地:
df_cleaned = df.groupBy("A").agg(F.max("B"))
不幸的是,这会丢弃所有其他列-dfïu cleaned只包含列“a”和最大值b。如何保留行?(“a、b、c……)
我几乎可以肯定这个问题以前被问过,但是通过stackoverflow搜索并没有回答我的问题。不是[2]的副本,因为我想要的是最大值,而不是最频繁的项。我是pyspark的新手,尝试做一些非常简单的事情:我想按列“a”分组,然后只保留列“b”中每个组的最大值行。这样地:
df_cleaned = df.groupBy("A").agg(F.max("B"))
不幸的是,这会丢弃所有其他列-dfïu cleaned只包含列“a”和最大值b。如何保留行?(“a、b、c……)
2条答案
按热度按时间nhjlsmyf1#
另一种可能的方法是应用joinDataframe,并将其自身指定为“leftsemi”。这种联接在左侧包含Dataframe中的所有列,在右侧不包含任何列。
例如:
通过执行以下操作可以选择b列和a列的最大值:
将此表达式用作左半联接中的右侧,并重命名获得的列
max(B)
回到原来的名字B
,我们可以得到所需的结果:这个解决方案背后的物理方案和公认答案中的物理方案是不同的,我仍然不清楚哪一个方案在大型Dataframe上性能更好。
使用spark sql语法可以获得相同的结果,方法如下:
jum4pzuy2#
你不需要一个
udf
使用Window
.考虑以下示例:
创建
Window
按列划分A
用这个来计算每组的最大值。然后过滤出行,使列中的值B
等于最大值。或等效使用
pyspark-sql
: