Spark:展平简单的多列DataFrame

时间:2018-11-02 15:46:12

标签: scala apache-spark-sql flatten flatmap

如何将简单(即无嵌套结构)数据框展平到列表中? 我的问题集是从节点对表中检测所有已更改/添加/删除的节点对。

这意味着我要比较“之前”和“之后”表。组合数据框之前和之后的数据会产生描述一对在一个数据框中出现但在另一数据框中不出现的行。

Example:
+-----------+-----------+-----------+-----------+
|before.id1 |before.id2 |after.id1  |after.id2  |
+-----------+-----------+-----------+-----------+
|       null|       null|         E2|         E3|
|         B3|         B1|       null|       null|
|         I1|         I2|       null|       null|
|         A2|         A3|       null|       null|
|       null|       null|         G3|         G4|

目标是获取整个数据框中所有(不同的)节点的列表,如下所示:

{A2,A3,B1,B3,E2,E3,G3,G4,I1,I2}

潜在方法:

  • 分别并区分所有列
  • flatMap和与众不同
  • 映射并展平

由于结构众所周知且很简单,因此似乎应该有一个同样直接的解决方案。 哪种方法或其他方法是最简单的方法?

其他说明

  • id1-id2对的顺序仅对更改检测很重要
  • 结果列表中的顺序并不重要
  • DataFrame在10k和100k行之间
  • 结果列表中的
  • 与众不同,但不是必需的;假设与独特的操作无关紧要

1 个答案:

答案 0 :(得分:1)

尝试执行以下操作,将所有行转换为seqs,然后收集所有行,然后展平数据并删除空值:

val df = Seq(("A","B"),(null,"A")).toDF 
val result = df.rdd.map(_.toSeq.toList)
   .collect().toList.flatten.toSet - null