首页 > 解决方案 > Spark:展平简单的多列 DataFrame

问题描述

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

这意味着我有一个“之前”和“之后”表来比较。结合之前和之后的数据帧产生的行描述了一对出现在一个数据帧中而不是另一个数据帧中的位置。

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}

潜在方法:

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

其他注意事项

标签: scalaapache-spark-sqlflattenflatmap

解决方案


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

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

推荐阅读