提前和滞后与groupby条件

时间:2018-11-29 05:46:27

标签: sql apache-spark apache-spark-sql

对于信号数据集中的每个constexpr,找到最旧和最新的entity_id的{​​{1}}。

在某些情况下,它可能是同一项目。如果有两个具有相同item_id的不同项目,则取较低month_id的项目。

最后将每个实体的信号计数求和,并输出为month_id。正确的输出应在每个唯一的item_id中包含1行。

输入:

total_signals

输出:

entity_id

如何使用窗口功能超前和滞后的特定entity_id: long item_id: integer source: integer month_id: integer signal_count: integer 列?

输入:

+ --------- + ------- + ------ + -------- + ------------ +

| entity_id | item_id | source | month_id | signal_count |

+ --------- + ------- + ------ + -------- + ------------ +

| 359781 | 20001 | 21000 | 201705 | 1 |

| 359781 | 20001 | 21000 | 201707 | 1 |

| 359781 | 3 | 21000 | 201708 | 2 |

| 359781 | 3 | 21000 | 201712 | 2 |

| 359781 | 3 | 975 | 201512 | 4 |

输出:

entity_id oldest_item_id newest_item_id total_signals

359781 3 3 23

152813413 1000 1000 2

224619015 0 3 12

使用Scala API和Spark数据框

1 个答案:

答案 0 :(得分:0)

您不会为此使用lead()lag()。您将使用聚合。在这种情况下,您还需要一些条件聚合。

这可能是最好的方法:

select t.entity_id, t.num_signals,
       tmin.item_id as item_id_min_month,
       tmax.item_id as item_id_max_month
from (select t.entity_id, sum(signal_count) as num_signals,
             min(month_id) as min_month_id,
             max(month_id) as max_month_id
      from t
     ) t join
     t tmin
     on tmin.entity_id = t.entity_id and
        tmin.month_id = t.min_month_id join
     t tmax
     on tmax.entity_id = t.entity_id and
        tmax.month_id = t.max_month_id ;

如果您的SparkSQL版本中提供了first_value()last_value(),您也可以使用它们。