【问题标题】:Alternative method to generate a cartesian product in Spark在 Spark 中生成笛卡尔积的替代方法
【发布时间】:2018-08-30 02:40:33
【问题描述】:

目前在我的 spark 代码中,我正在执行以下操作:

rdd2 = rdd1.cartesian(rdd1)
rdd2.filter( remove_some_data filter)

原来它首先计算完整的笛卡尔坐标,然后过滤掉不必要的组合。

有没有办法只使用我想要的组合来创建 PairRDD?

更详细:

我有 N 个项目的 RDD。

笛卡尔积产生 N x N 项。 我只想要这 N 个项目之间的独特交互。

即对于用户 1:N-1 对
对于用户 2:N-2 对
对于用户 3:N-3 对
.
.
.
对于用户 N-1:1 对

所以 PairRDD 中总共有 1 + 2 + .... + (N-1) 个元素。

我目前的实现方式是使用

rdd.cartesian(rdd).filter(my_filter_function). 

相反,我直接想要得出最终结果组合。

【问题讨论】:

  • 能否分享一下用户表的数据结构
  • 所以你想做一个cartesian和一个filter而不做一个cartesian和一个filter??
  • 看看this question。最有效的似乎是 rdd.cartesian(rdd).filter{ case (a,b) => a
  • @GlennieHellesSindholt 没错

标签: java apache-spark


【解决方案1】:

此幻灯片中的幻灯片 20 提出了一个替代方案,尽管我自己还没有尝试过。链接:https://www.slideshare.net/databricks/optimizing-apache-spark-sql-joins

相关摘录为:

  1. 根据 UID 创建 UID 的 RDD
  2. 强制广播表的行
  3. 根据 UID 调用给定 UID 的 UDF 以查找表行并执行计算
  4. 在样本集上计算时间以调整集群大小

【讨论】:

    猜你喜欢
    • 2016-10-08
    • 2016-05-07
    • 1970-01-01
    • 1970-01-01
    • 2021-05-06
    • 2021-09-05
    • 1970-01-01
    • 2011-12-26
    • 2020-08-12
    相关资源
    最近更新 更多