【问题标题】:How to design this spark join如何设计这个火花连接
【发布时间】:2016-06-05 23:11:38
【问题描述】:

我需要加入两个大型 RDD,并且可能加入两次。任何帮助设计这些连接表示赞赏。

  • 问题来了,

  • 第一个RDD为productIdA, productIdB, similarity,大小约为100G。

  • 第二个RDD为customerId, productId, boughtPrice,大小约为35G。

  • 我想要的结果RDD是productIdA, productIdB, similarity, customerIds bought both product A and B

  • 因为我不能广播任何一个 RDD,因为它们都很大,我的设计是通过 product id 聚合第二个 RDD,然后加入第一个 RDD twice,但我得到了巨大的 shuffle 溢出和所有各种错误(OOM 或由于随机播放而导致空间不足)。把错误放在一边,我想知道是否有更好的方法来达到同样的结果。谢谢

【问题讨论】:

  • similarity 是如何计算的?
  • 您到底想收到什么?您将有什么搜索条件?加入计划取决于您要搜索的内容以及您希望获取多少结果。有时,拥有一张临时表等会更有效率。你可以给我们很多细节。它是一次查询还是常规查询?海量数据查询非常具体。尽可能地帮助我们。
  • @zero323 相似度是由其他组件使用价格、供应商等产品特征计算出来的。
  • @mita 所以第一个 rdd 就像一个基于内容的产品相似度矩阵,由其他团队计算。第二个rdd是客户交易。此作业不是查询,而是批处理作业,通过使用客户交互对相似度得分进行加权。希望这能让它变得干净。

标签: join apache-spark rdd


【解决方案1】:

第一个 RDD 中的每个产品配对都有一行吗?

如果你这样做(或接近),那么你可能想做一些事情,比如将第二个 RDD 按customerId 分组,为每个配对创建一个元素,然后通过配对重新排列和分组该 RDD,然后分组以获得一个customerIds 的列表,然后加入以添加 similarity

(我认为,这是否会导致更多或更少的数学计算取决于每位客户购买的产品数量的分布。)

就像 zero323 的评论还暗示,一旦你从 customerId 上分组得到配对,重新计算 similarity 可能比加入一个庞大的数据集更便宜。

【讨论】:

  • 我要补充一点,当你已经有了实际的配对时,你可以在大约 O(N) 内过滤第一个 RDD,以使最终加入的成本大大降低。
  • 谢谢马特,Zero323。就像我刚刚添加的评论一样,sim 分数是由其他组件计算的,这里我使用客户交易对这些 sim 分数应用权重。
  • 我会试试你的方法。
猜你喜欢
  • 2019-10-19
  • 2021-05-16
  • 2016-12-09
  • 1970-01-01
  • 2019-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-03
相关资源
最近更新 更多