我看不出有任何功能內置,但您可以使用UDF:
import scala.collection.mutable.WrappedArray;
val intersect = udf ((a : WrappedArray[Int], b : WrappedArray[Int]) => {
var count = 0;
a.foreach (x => {
if (b.contains(x)) count = count + 1;
});
count;
});
// test data sets
val one = sc.parallelize(List(
(1, Array(1, 2, 3)),
(2, Array(1,2 ,3, 4)),
(3, Array(1, 2,3)),
(4, Array(1,2))
)).toDF("user", "arr");
val two = sc.parallelize(List(
(1, Array(1, 2, 3)),
(2, Array(1,2 ,3, 4)),
(3, Array(1, 2, 3)),
(4, Array(1))
)).toDF("user", "arr");
// usage
one.join(two, one("user") === two("user"))
.select (one("user"), intersect(one("arr"), two("arr")).as("intersect"))
.where(col("intersect") > 2).show
// version from comment
one.join(two)
.select (one("user"), two("user"), intersect(one("arr"), two("arr")).as("intersect")).
where('intersect > 2).show
你的udf解決方案似乎解決了我的問題。只有一點注意,我不想加入相同的用戶標識,我想要不同的用戶ID至少有三個常用元素在數組中。 – Vektor88
@ Vektor88所以交叉加入後+過濾器。將很慢,但沒有其他選擇 –
@ Vektor88我已經更新了答案 –