【发布时间】:2021-09-24 17:45:46
【问题描述】:
我有一个 PySpark 数据框如下
Customer_ID Address_ID Order_ID Order_Date
Cust_1 Addr_1 1 31-Dec-20
Cust_1 Addr_1 2 23-Jan-21
Cust_1 Addr_1 3 06-Feb-21
Cust_1 Addr_2 4 13-Feb-21
Cust_1 Addr_2 5 20-Feb-21
Cust_1 Addr_3 6 18-Mar-21
Cust_1 Addr_3 7 23-Mar-21
Cust_2 Addr_4 8 31-Dec-20
Cust_2 Addr_4 9 23-Jan-21
Cust_2 Addr_4 10 06-Feb-21
Cust_2 Addr_4 11 13-Feb-21
Cust_2 Addr_4 12 20-Feb-21
Cust_2 Addr_5 13 18-Mar-21
Cust_2 Addr_5 14 23-Mar-21
这些列分别放置customer id、address id、order id和date the order was
Order_ID 始终是唯一的
对于每个订单(每一行),我需要计算(客户 c1,地址 a1) 对的订单份额
用 ord_share(c1,a1) 表示 order_share,由以下公式定义,
The total number of orders between (Order_Date) and (Order_Date - 90 days) by c1 from a1
----------------------------------------------------------------------------------------
The total number of orders between (Order_Date) and (Order_Date - 90 days) for all addresses by c1
注意 - 上式中的下划线表示除法
90 天是窗口大小。
上表中的一个示例:(为了便于理解,我将order_share 留作一小部分)
对于 ORDER_ID 7:
订单总数为 7 - (by Cust_1)
ord_share(Cust_1,Addr_1) = 3/7, ord_share(Cust_1,Addr_2) = 2/7 , ord_share(Cust_1,Addr_3) = 2/7
对于 ORDER_ID 6:
订单总数为 6 - (by Cust_1)
ord_share(Cust_1,Addr_1) = 3/6, ord_share(Cust_1,Addr_2) = 2/6 , ord_share(Cust_1,Addr_3) = 1/6
对于 ORDER_ID 5:
订单总数为 5 - (by Cust_1)
ord_share(Cust_1,Addr_1) = 3, ord_share(Cust_1,Addr_2) = 2, ord_share(Cust_1,Addr_3) = 0
等等...我需要为所有行存储这些。我的输出格式应该是这样的
(Is_original_address - 此列指的是Address_ID是否是下订单的原始地址)
Customer_ID Address_ID Order_ID Order_Share Is_original_address
Cust_1 Addr_1 7 3/7 0
Cust_1 Addr_2 7 2/7 0
Cust_1 Addr_3 7 2/7 1
Cust_1 Addr_1 6 3/6 0
Cust_1 Addr_2 6 2/6 0
Cust_1 Addr_3 6 1/6 1
Cust_1 Addr_1 5 3/5 0
Cust_1 Addr_2 5 2/5 1
Cust_1 Addr_3 5 0/5 0
.
.
.
For all rows
所以基本上,输入中的每一行会根据客户的地址数扩展到输出中的多行
注意 - 初始数据框中的列未按排序顺序或按任何顺序分组,我只是选择这样一个示例来帮助解释
我发现解决这个问题非常困难。我想了很多,我似乎想不出任何加入/分组数据的方法来做到这一点,因为每一行都是独一无二的。我真的不确定如何获取输出数据帧。
从我的想法来看,我必须克隆原始数据框,并且对于每一行,我可能必须进行多个分组或连接。我真的不确定如何开始实施。
任何帮助将不胜感激。谢谢!
如果需要任何其他信息,请告诉我。
【问题讨论】:
标签: python apache-spark pyspark apache-spark-sql