我懷疑我們可以逃逸到各元件相互比較(雙環流的在非分佈式算法的等效) 。集合之間的子集操作不是自反的,這意味着我們需要比較is "alice" subsetof "bob"
和is "bob" subsetof "alice"
。
爲此使用Spark API,我們可以訴諸使用笛卡爾積與本身的數據乘以和驗證結果矩陣的每個條目:
val data = Seq(("peter",Set(1,2,3)), ("mike",Set(1,3)), ("anne", Set(7)),("jack",Set(5,4,1)), ("lizza", Set(5,1)), ("bart", Set(5,4)), ("maggie", Set(5)))
// expected result from this dataset = peter, olga, anne, jack
val userSet = sparkContext.parallelize(data)
val prod = userSet.cartesian(userSet)
val subsetMembers = prod.collect{case ((name1, set1), (name2,set2)) if (name1 != name2) && (set2.subsetOf(set1)) && (set1 -- set2).nonEmpty => (name2, set2) }
val superset = userSet.subtract(subsetMembers)
// lets see the results:
superset.collect()
// Array[(String, scala.collection.immutable.Set[Int])] = Array((olga,Set(1, 2, 3)), (peter,Set(1, 2, 3)), (anne,Set(7)), (jack,Set(5, 4, 1)))
那你有關係嗎? '(「peter」,Set(1,2,3))'&'(「olga」,Set(1,2,3))' – maasg
只需刪除其中一個。保持哪一個並不重要。 –
提供的解決方案保留了兩者。您被邀請適應您的特定需求。 – maasg