scala - 如何获得两个 RDD [(String, Iterable[String])] 的交集
问题描述
数据由两列组成
A B
A C
A D
B A
B C
B D
B E
C A
C B
C D
C E
D A
D B
D C
D E
E B
E C
E D
在第一行,可以认为 A 和 B 是朋友等。我如何找到他们共同的朋友?
(A,B) -> (C D)
意思是 A 和 B 有共同的朋友 C 和 D。我和 groupByKey 一样接近,结果如下。
(B,CompactBuffer(A, C, D, E))
(A,CompactBuffer(B, C, D))
(C,CompactBuffer(A, B, D, E))
(E,CompactBuffer(B, C, D))
(D,CompactBuffer(A, B, C, E))
编码:
val rdd: RDD[String] = spark.sparkContext.textFile("twocols.txt")
val splitrdd: RDD[(String, String)] = rdd.map { s =>
var str = s.split(" ")
new Tuple2(str(0), str(1))
}
val group: RDD[(String, Iterable[String])] = splitrdd.groupByKey()
group.foreach(println)
解决方案
首先swap
是元素:
val swapped = splitRDD.map(_.swap)
然后自加入并swap
返回:
val shared = swapped.join(swapped).map(_.swap)
最后过滤掉重复项(如果需要)和groupByKey
:
shared.filter { case ((x, y), _) => x < y }.groupByKey
推荐阅读
- markdown - 使用 pandoc markdown 使图像居中
- python - OperationalError:“%”附近:Python 中 sqlite3 的语法错误
- c# - While 循环按 + 1 计数
- reactjs - 反应页面中的 Facebook 像素
- unity3d - 在 Unity 中使用触摸快速移动对象在屏幕上?
- php - php上传图片更改名称到数据库中的id号
- boolean - 布尔逻辑表示的可除性(可满足性)
- javascript - 在按钮 SUBMIT 上将单选按钮值从表单解析为 GA
- accelerometer - MPU6050 四元数数学
- automation - VSCode 的脚本/无头自动化?