在组和agg之后显示所有pyspark列

在组和agg之后显示所有pyspark列,pyspark,Pyspark,我希望按一列分组,然后找到另一列的最大值。最后,显示基于此条件的所有列。然而,当我使用我的代码时,它只显示2列,而不是全部 # Normal way of creating dataframe in pyspark sdataframe_temp = spark.createDataFrame([ (2,2,'0-2'), (2,23,'22-24')], ['a', 'b', 'c'] ) sdataframe_temp2 = spark.createDataFram

我希望按一列分组,然后找到另一列的最大值。最后,显示基于此条件的所有列。然而,当我使用我的代码时,它只显示2列,而不是全部

# Normal way of creating dataframe in pyspark
sdataframe_temp = spark.createDataFrame([
    (2,2,'0-2'),
    (2,23,'22-24')],
    ['a', 'b', 'c']
)

sdataframe_temp2 = spark.createDataFrame([
    (4,6,'4-6'),
    (5,7,'6-8')],
    ['a', 'b', 'c']
)
# Concat two different pyspark dataframe
sdataframe_union_1_2 = sdataframe_temp.union(sdataframe_temp2)

sdataframe_union_1_2_g = sdataframe_union_1_2.groupby('a').agg({'b':'max'})

sdataframe_union_1_2_g.show()
输出:

+---+------+
|  a|max(b)|
+---+------+
|  5|     7|
|  2|    23|
|  4|     6|
+---+------+
预期产出:

+---+------+-----+
|  a|max(b)| c   |
+---+------+-----+
|  5|     7|6-8  |
|  2|    23|22-24|
|  4|     6|4-6  |
+---+------+---+
您可以使用以下方法使其工作:

方法1:使用窗口函数

解释

当我们想要将新列附加到现有列集合时,窗口函数非常有用。 在本例中,我告诉窗口函数按partitionBy'a'列进行分组,并按F.descb降序对列b进行排序。这使每组中b中的第一个值成为其最大值。 然后我们使用F.row_number过滤行数等于1的最大值。 最后,我们删除新列,因为它在过滤数据帧后没有被使用。 方法2:使用groupby+内部联接


你能解释一下你使用的方法吗?我看到我的groupby和agg函数没有被使用,仍然得到了正确的答案。谢谢!但是否可以使用我的方法,但同时也使用窗口方法>我希望了解更多不同的方法。只有在可能的情况下才能这样做。再次感谢。这很好,你可以通过更多的步骤来实现。分组df后,您需要将其与sdataframe_union_1_2进行内部联接才能得到结果。非常抱歉,您可以将其包含在上述答案中吗?完成,请检查。一定要接受有帮助的答案:
import pyspark.sql.functions as F
from pyspark.sql.window import Window

w = Window().partitionBy("a").orderBy(F.desc("b"))

(sdataframe_union_1_2
.withColumn('max_val', F.row_number().over(w) == 1)
.where("max_val == True")
.drop("max_val")
.show())

+---+---+-----+
|  a|  b|    c|
+---+---+-----+
|  5|  7|  6-8|
|  2| 23|22-24|
|  4|  6|  4-6|
+---+---+-----+
f = sdataframe_union_1_2.groupby('a').agg(F.max('b').alias('b'))

sdataframe_union_1_2.join(f, on=['a','b'], how='inner').show()

+---+---+-----+
|  a|  b|    c|
+---+---+-----+
|  2| 23|22-24|
|  5|  7|  6-8|
|  4|  6|  4-6|
+---+---+-----+