apache spark SQL:运行相同事务的总计而不使用前面的无界行



我正在尝试计算"司机在特定日期赚取的出租车费">的运行总数。最初在Netezza上测试,现在尝试在spark-sql上编码。

但是,如果对于结构为 ((司机,天( --> 票价(的两行,如果"票价"值相同,则running_total列始终显示最终总和!如果所有的票价都是不同的,它被完美地计算。有没有办法在不使用rowsBetween(start,end(的情况下实现这一点(在ANSI SQL或Spark数据帧中(?

示例数据 :

driver_id<<<<>>>>date_id  <<<<>>>>fare
10001           2017-07-27        500
10001           2017-07-27        500
10001           2017-07-30        500
10001           2017-07-30        1500

我触发的 SQL 查询以计算运行总计

select driver_id, date_id, fare , 
sum(fare)
over(partition by date_id,driver_id 
order by date_id,fare ) 
as run_tot_fare
from trip_info
order by 2

结果:

driver_id <<<<>>>> date_id <<<<>>>> fare <<<<>>>> run_tot_fare
10001              2017-07-27       500           1000 --**Showing Final Total expecting 500**
10001              2017-07-27       500           1000
10001              2017-07-30       500           500 --**No problem here**
10001              2017-07-30       1500          2000

如果有人能好心地让我知道,我做错了什么,如果它可以在不使用行无界前缀/行之间(b,e(的情况下实现,那么我非常感谢。提前谢谢。

SQL中的传统解决方案是使用range而不是rows

select driver_id, date_id, fare , 
sum(fare) over (partition by date_id, driver_id 
order by date_id, fare
range between unbounded preceding and current rows
) as run_tot_fare
from trip_info
order by 2;

如果没有,则两级窗口函数或聚合和连接:

select driver_id, date_id, fare,
max(run_tot_fare_temp) over (partition by date_id, driver_id ) as run_tot_fare
from (select driver_id, date_id, fare , 
sum(fare) over (partition by date_id, driver_id 
order by date_id, fare
) as run_tot_fare_temp
from trip_info ti
) ti
order by 2;

(max()假设票价永远不会为负。

最新更新