ApacheSpark—高效地创建大型交互矩阵(数十亿到万亿个单元)aws胶水Pypark etl

bpzcxfmw  于 2021-05-27  发布在  Spark
关注(0)|答案(1)|浏览(408)

我正在尝试透视数据并生成一个用于建模的用户项交互矩阵。我一直在执行这项任务。
在我的样本中,我有53000个客户,他们购买了超过1000000种不同的产品。这将产生一个相互作用矩阵,约有530亿个细胞需要填充。看起来是这样的:

clientID  ProductID  Purchased
1         1          1
1         2          1
2         1          1
2         3          1
3         2          1
N.B. Purchased is a tinyint dummy indicating if a customer bought a product. 
There are no rows for when a customer has not purchased.

目前我一直在使用以下代码:

pivot = df.groupby("clientid").pivot("productid").agg(max("Purchased"))

现在,我已经允许这个作业在150个节点(Quadcore16GB节点)下运行超过2天,但仍然没有显示任何内容。这让我非常清楚这项服务的成本,特别是考虑到这是一个人口样本,未来这项服务将需要扩大到100万以上的客户。
有人能确认是否有一个更有效的计算方法来执行上述操作,并向我解释这一点吗?
谢谢您的帮助。如果你需要更多的细节,请告诉我。

t9eec4r0

t9eec4r01#

为了 Nclientid 将有相同数量的行 productid . 那么对于下面的问题,我说的对吗

pivot = df.groupby("clientid").pivot("productid").agg(max("Purchased"))

在没有优化的情况下,表将是 然后这会被聚合操作缩小。
所以,为什么不先聚合(也许它不能再是max了,但是说 sum 或者 int(mean() )然后旋转?在没有优化的情况下,这应该会有所不同。除此之外,对于这样一个直截了当的人,除了一个巨大的支点,我们无能为力。

相关问题