Python 如何在PySpark中的数据帧内按总和排序?

Python 如何在PySpark中的数据帧内按总和排序?,python,pyspark,spark-dataframe,Python,Pyspark,Spark Dataframe,类似于: 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.

类似于:

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:无法解析给定输入列order\u item\u order\u id、sum(order\u item\u subtotal#429)的“sum”

我也尝试过:

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\u item\u order\u id、SUM(order\u item\u subtotal)的“SUM(订单项目小计)”

我在执行时得到了正确的结果:

order_items.groupBy("order_item_order_id").sum("order_item_subtotal").orderBy(desc("SUM(order_item_subtotal#429)")).show()
但这是在看到Spark附加到sum列名称后面的数字后,即#429进行的


是否有一种方法可以获得相同的结果,但是是先验的,而不知道将追加哪个数字?

您应该为列使用别名:

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\u item\u order\u id”(类似于count函数的输出),我将此作为参数添加到agg函数中:
order\u items.groupBy(“order\u item\u order\u id”)\.agg(order\u items[“order\u item\u order\u id”],\func.sum(“order\u item\u subtotal”)\。别名(“sum\u column\u name”)\.orderBy(“sum\u column\u name”)
然而,我想知道是否有一种更简单的方法来获得相同的结果,如计数示例中所示。您不需要使事情复杂化,只需使用提供的代码:
order\u items.groupBy(“order\u item\u order\u id”).agg(func.sum(“order\u item\u subtotal”).别名(“sum\u column\u name”)).orderBy(“sum\u column\u name”)
我已经对它进行了测试,它可以正常工作。您的代码只提供“sum\u column\u name”列作为输出,我还需要“order\u item\u order\u id”列。这就是我必须在agg中添加此列的原因:
order\u items.groupBy(“order\u item\u order\u id”).agg(order\u items[“order\u item\u order\u id”]),func.sum(“订单\项目\小计”)。‌别名(“SUMIN CalnNo.NeX”).OrrdBube(“SUMIN CulnNo.NoX”)哦,我明白了,你是对的,请考虑使用“代码> Cube < /Cord>”,如果你需要多个不同聚合函数的聚合级别。例如,你可以写:<代码> OrthyToase.Cube('OrthoItIsOrthOrthOrthId,'SouthOffer-Stand),agg({'order\u item\u subtotal':'sum','*':'count'})