在组和agg之后显示所有pyspark列
我希望按一列分组,然后找到另一列的最大值。最后,显示基于此条件的所有列。然而,当我使用我的代码时,它只显示2列,而不是全部在组和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
# 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|
+---+---+-----+