基于另一个表PySpark / SQL的datetime列的聚合列

问题描述 投票:0回答:2

我目前正在尝试使用另一个表中的日期在表的列上执行与日期相关的汇总。表1包含用户ID和日期(以及其他未汇总的信息)。表2包含了我希望汇总的值以及相同的ID和不同的日期。

目标是汇总表2中的值如果它们在表1中的行的日期之前。

在下面的插图中,所需的聚合函数是“平均值”,但是,如果可以提供常规的PySpark(或SQL)解决方案,以允许该聚合函数成为内置函数(F.mean,F.sum)< [或理想的自定义用户定义函数。

表1-日期表(注意:两个表中都可以重复使用用户ID)

+---+---------- +---------- |USER| DATE |USER_STATE| +---+---------- +---------- | 3 | 7/1/2019 | Current | | 1 | 6/9/2019 | Expired | | 1 | 1/1/2019 | Current | +----+----------+-----------

表2

-汇总表+---+---------- +---------- |USER|CHARGEDATE|AMOUNTPAID| +---+---------- +---------- | 1 | 7/1/2018 | 10.00 | | 1 | 5/1/2019 | 40.00 | | 1 | 2/2/2019 | 10.00 | | 3 | 1/2/2019 | 15.00 | +----+----------+-----------

所需的输出

-聚合(平均值)是针对每个用户计算的,并且取决于CHARGEDATE在表1中的DATE之前]+---+---------- +----------+--------------- |USER| DATE |USER_STATE|MEAN_AMOUNTPAID| +---+---------- +----------+--------------- | 3 | 7/1/2019 | Current | 15.00 | | 1 | 6/9/2019 | Expired | 20.00 | | 1 | 1/1/2019 | Current | 10.00 | +----+----------+----------+--------------- Row 2 - includes all user 1 Table 2 values because all ChargedDate< date Row 3 - includes only includes user 1's row 1 Table 2 value because it's the only chargeddate less than date
我知道,可以通过在表1的每一行上运行一个循环来获取该行的DATE,然后使用它来查询第二张表,这可能是无效的。如果可能,我正在寻找没有循环的解决方案。预先感谢!

我目前正在尝试使用另一个表中的日期在表的列上执行与日期相关的汇总。表1包含用户ID和日期(以及其他未汇总的信息)。 ...

mysql sql pyspark pyspark-sql
2个回答
0
投票
尝试以下操作,也可以在此处sqlfiddle进行检查

0
投票

[PySpark

© www.soinside.com 2019 - 2024. All rights reserved.