如何在PySpark中按sum排序DataFrame?

4

类比于:

order_items.groupBy("order_item_order_id").count().orderBy(desc("count")).show()

我已经尝试过:

order_items.groupBy("order_item_order_id").sum("order_item_subtotal").orderBy(desc("sum")).show()

但是这会导致错误:

Py4JJavaError:调用o501.sort时发生错误。 :org.apache.spark.sql.AnalysisException:无法解析“sum”,给定输入列为order_item_order_id,SUM(order_item_subtotal#429);

我也尝试过:

order_items.groupBy("order_item_order_id").sum("order_item_subtotal").orderBy(desc("SUM(order_item_subtotal)")).show()

但我得到了相同的错误:

Py4JJavaError: 在调用o512.sort时发生错误。: org.apache.spark.sql.AnalysisException:无法解析“给定输入列 order_item_order_id, SUM(order_item_subtotal#429)的 SUM(order_item_subtotal)。”

当执行以下操作时,我可以得到正确的结果:

order_items.groupBy("order_item_order_id").sum("order_item_subtotal").orderBy(desc("SUM(order_item_subtotal#429)")).show()

但是这是在看到Spark附加到总列名称的数字,即#429之后才完成的。

是否有一种方法可以在事先不知道将添加哪个数字的情况下获得相同的结果?

1个回答

11

您应该为列使用别名:

import pyspark.sql.functions as func

order_items.groupBy("order_item_order_id")\
           .agg(func.sum("order_item_subtotal")\
                .alias("sum_column_name"))\
           .orderBy("sum_column_name")

谢谢。为了获取“order_item_order_id”列(类似于使用count函数的输出),我已将其作为agg函数的参数添加: order_items.groupBy("order_item_order_id")\ .agg(order_items["order_item_order_id"],\ func.sum("order_item_subtotal")\ .alias("sum_column_name"))\ .orderBy("sum_column_name")不过,我想知道是否有更简单的方法来获得与计数示例相同的结果。 - Albert Villanova del Moral
1
不需要把事情弄得复杂化,只需使用提供的代码:order_items.groupBy("order_item_order_id").agg(func.sum("order_item_subtotal").alias("sum_column_name")).orderBy("sum_column_name") 我已经测试过了,它可以正常工作。 - architectonic
你的代码只输出了“sum_column_name”列,但我还需要“order_item_order_id”列。这就是为什么我不得不在agg中添加这一列的原因:order_items.groupBy("order_item_order_id").agg(order_items["order_item_order_id"], func.sum("order_item_subtotal").‌alias("sum_column_name")).orderBy("sum_column_name") - Albert Villanova del Moral
1
哦,我明白了,你是正确的。如果您需要使用不同的聚合函数进行多级聚合,请考虑使用 cube。例如,您可以编写: order_items.cube('order_item_order_id', 'some_other_column').agg({'order_item_subtotal': 'sum', '*': 'count'}) - architectonic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接