【问题标题】:Efficiently creating a large interaction matrix (billions to trillions of cells). AWS Glue PySpark ETL有效地创建一个大型交互矩阵(数十亿到数万亿个细胞)。 AWS Glue PySpark ETL
【发布时间】:2020-05-26 17:05:31
【问题描述】:

我正在尝试透视数据并生成用于建模的用户-项目交互矩阵。 我一直将其作为 AWS Glue Spark 作业执行。

在我的示例中,我有 53,000 名客户购买了超过 1,000,000 种不同的产品。这将产生一个包含约 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 个节点(四核 16GB 节点)上运行超过 2 天,但仍然没有任何可显示的内容。这让我非常清楚这样做的成本,特别是考虑到这是一个人口样本,并且在未来这将需要扩大到超过一百万的客户。

有人可以确认是否有一种计算效率更高的方法来执行上述操作并向我解释一下吗?

感谢您提前提供的任何帮助。如果您需要任何详细信息,请告诉我。

【问题讨论】:

  • @mazaneicha 确实可以这样做以帮助进行样本计算,但从长远来看将无法正常工作,因为完整的数据集大致具有 clientIDs = ProductIDs
  • 抱歉,53K 客户与 1M 产品让您感到兴奋...如果您希望您的客户群也增长到 MM,我想最好开始关注 glom()ing分区并构建稀疏矩阵以进行分析。

标签: apache-spark pyspark etl aws-glue


【解决方案1】:

对于N 的行clientidproductid 的行数将相同。那么对于以下查询,我是否正确地说

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

在没有优化的情况下,表将是,然后它会被聚合操作缩小。

那么,为什么不先聚合(也许它不能再达到最大值,而是说sumint(mean())然后进行旋转?在没有优化的情况下,这应该会有所作为。除此之外,对于这样一个直截了当的前进,我们无能为力,只能是一个巨大的支点。

【讨论】:

  • 如果我误解了您的解决方案,请原谅我,但我认为这不会减少计算规模。 “Purchased”变量只是一个虚拟变量,因此最小值/最大值只能是 0/1。
  • 我明白了。在这种情况下,您并没有误解我的解决方案,但是嘿,您的矩阵非常庞大,而且非常稀疏。在这种情况下,我更愿意编写一个并行的 C++ 代码,而不是 pandas pivot,在该代码中,我用对应于非零值的索引 (i, j) 来表示我的矩阵。然后,您就拥有了用于矩阵分解的非常简洁的并行 C++ 算法。很抱歉,由于我的个人时间限制,我无法提供完整的解决方案,但我可以尝试编写一个可以用作伪代码的 python 例程。
  • 我想知道这个user-item interaction 矩阵的数学要求是什么,以及您打算如何将它用于下游应用程序?会变成user-by_user matrix 还是item-by-item matrix
  • 所以一些事情。首先,感谢您的回复。所以我使用的是 Pyspark pivot 而不是熊猫。这应该在我分配好的 150 个 DPU 中并行化。它也适用于NULL,其中没有值而不是 0,因此矩阵的大小应该最小化
  • 这个矩阵的用例是生成与矩阵分解相关的常用用户/项目向量,然后从我们将使用自动编码器生成的嵌入式用户/项目向量中增强这些。然后系统将用于向用户推荐新商品以供购买。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-29
  • 2021-12-14
  • 1970-01-01
  • 2018-04-16
  • 2010-10-22
  • 1970-01-01
相关资源
最近更新 更多