我有一个包含2列的Spark DataFrame:C1:Seq[Any]
和C2:Double
。我想
C1
。对于c1
中的每个元素C1
,请与C1
中长度超过c1
的所有其他元素进行比较。
2.1如果c1
包含在另一个元素cx
中,则将c2
与c2x
进行比较。
2.2如果c2
> c2x
,然后过滤掉(c1x, c2x)
。
有没有一种优雅的方法来实现这一目标?
示例输入:
C1 C2
ab 1.0
abc 0.5
预期产出:
C1 C2
ab 1.0
包含=子集。例如ab包含在abc中。
答案 0 :(得分:-1)
我有一个包含2列的Spark DataFrame:C1:Seq [Any]和C2:Double
val rdd = sc.parallelize(List(("ab", 1.0), ("abc", 0.5)))
- 按
的长度排序 醇>C1
。
val rddSorted = rdd.sortBy(_._1.length).collect().distinct
- 对于
醇>c1
中的每个元素C1
,请与C1
中长于c1
的所有其他元素进行比较。
2.1如果c1
包含在另一个元素cx
中,则将c2
与c2x
进行比较。
2.2如果c2
>c2x
,然后过滤掉(c1x, c2x)
。
val result = for(
(x, y) <- rddSorted;
(a, b) <- rddSorted.dropWhile{case(c,d) => c == x && d == y};
if(a.contains(x) && a.length > x.length && y > b)
)yield (x, y)
多数民众赞成。你应该得到你想要的东西