我正在做一些Spark培训,并且想知道如何优化我的任务之一。目标很简单:根据下表中的订单日期和状态,计算不同数量的订单和总订单价值:
这必须在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中工作的唯一方法是分三个步骤:
计算总订单
df_to = df.groupby('order_date','order_status') \
.agg(countDistinct(df.order_id) \
.alias('total_orders'))
计算不同的订单商品ID
df_ta = df.groupby('order_date','order_status') \
.sum('order_item_subtotal') \
.alias('total_amount') \
.withColumnRenamed("sum(order_item_subtotal)","total_amount")
加入以上表格
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)
有没有更聪明的方法?预先感谢您!
答案 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