目前在我的火花代码中,我正在执行以下操作:
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).
相反,我直接想要得出最终结果组合。
答案 0 :(得分:0)
此幻灯片组中的幻灯片20提出了另一种选择,尽管我自己还没有尝试过。链接:https://www.slideshare.net/databricks/optimizing-apache-spark-sql-joins
相关摘录为:
- 通过UID创建UID的RDD
- 强制广播表中的行
- 通过UID调用给定UID的UDF以查找表行并执行计算
- 将计算时间安排在样本集上以调整群集大小