我在使用 spark 的 scala 中有一个包含 27770 条目的数据框。此数据框仅包含一列整数。我想单独合并此列,以便生成一个新的数据框,每 2 个值都有对。我想为数据框中的每一行执行此操作。我正在尝试通过以下代码执行此操作:
for (elem1 <- nodeDf.collect()) {
for (elem2 <- nodeDf.collect()) {
if(elem1 != elem2 && elem2 > elem1) {
//get pair elem1, elem2
}
}
}
Intellij 向我显示有关“>”运算符的错误说“无法解析符号”。
我做错了什么?如何为所有值的每个组合获得一个包含两列的新数据框?
例如:输入数据框包含
1
2
3
我想得到一个新的数据框,如下所示:
1,2
1,3
2,3
我想跳过像 1,1 、 2,2 或 2,1 这样的对,因为我已经准备好了 1,2 这对我来说是一样的。
谢谢。
最佳答案
你可以做一个 carstesian product DataFrame
本身。
val result =
df.as("a").crossJoin(
df.as("b")
).filter(
($"a.id" =!= $"b.id") && ($"b.id" > $"a.id")
)
你的代码不起作用的原因是因为在 DataFrame
上执行 collect
会得到一个 Array[Row]
Row
中没有这样的>
方法。
您可以通过使用 .as[Int]
将 DataFrame
转换为 Dataset[Int]
或通过获取元素来修复它elem1.getAsInt(0)
的行,但是...
不要那样做!。
Collect 将你所有的分布式数据返回给 driver,这不仅是危险的,而且破坏了 Spark 本身的所有目的。
此外,更不用说对相同数据进行双重收集
是无用且昂贵的。
关于algorithm - 如何在 Scala 中的数据框中获取成对的 x 值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54246318/