algorithm - 如何在 Scala 中的数据框中获取成对的 x 值?

标签 algorithm scala apache-spark dataframe operation

我在使用 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/

相关文章:

c - 字符串格式化时间优化 : pad a line to length K by adding spaces between words

apache-spark - Spark 数据帧分组到列表中

java - 如何反转或求补 Java 中返回 boolean 值的函数的输出

hive - Spark : Hive Query

algorithm - Scala 中的合并排序

c++ - 提升图形库 : Is there a neat algorithm built into BGL for community detection?

scala - 为什么 TraversableOnce.toSeq 返回一个流?

scala - 在 Scala 选项类型 isEmpty 方法中检查 None

python - 有效交换 python 字典的键和值,其中值包含一个或多个元素

scala - 关于 Java 和 Scala 中的泛型