使用一个命令在Spark中进行独特和汇总聚合

时间:2018-09-19 19:00:25

标签: python scala apache-spark pyspark apache-spark-sql

我正在做一些Spark培训,并且想知道如何优化我的任务之一。目标很简单:根据下表中的订单日期和状态,计算不同数量的订单和总订单价值:

Input table

这必须在Spark的Dataframe API(Python或Scala)中完成,不要 SQL。

在SQL中,这很简单:

select order_status, order_date, count(distinct order_item_id), sum(order_item_subtotal) 
from df 
group by order_status, order_date

我可以使其在PySpark中工作的唯一方法是分三个步骤:

  1. 计算总订单

    df_to = df.groupby('order_date','order_status') \ .agg(countDistinct(df.order_id) \ .alias('total_orders'))

  2. 计算不同的订单商品ID

    df_ta = df.groupby('order_date','order_status') \ .sum('order_item_subtotal') \ .alias('total_amount') \ .withColumnRenamed("sum(order_item_subtotal)","total_amount")

  3. 加入以上表格

    dfout = df_to.join(df_ta, [df_to.order_date == df_ta.order_date, df_to.order_status == df_ta.order_status], 'inner').select(df_to.order_date, df_to.order_status, df_to.total_orders, df_ta.total_amount)

有没有更聪明的方法?预先感谢您!

1 个答案:

答案 0 :(得分:1)

$ratio = 0; $dividedBy = $postup + $postdown; if($dividedBy != 0) { $ratio = ($postup * 100) / $dividedBy; echo $ratio; } else { echo "Can not divide by zero!!"; } 中,您可以像这样在agg中执行两种计算:

groupby