Spark:展平简单的多列 DataFrame
Spark: Flatten simple multi-column DataFrame
如何将一个简单的(即没有嵌套结构的)数据帧展平为一个列表?
我的问题集是从 table 节点对中检测 changed/added/removed 的所有节点对。
这意味着我有一个 "before" 和 "after" table 可以比较。组合前后数据框产生的行描述了一对出现在一个数据框中而不是另一个数据框中的位置。
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 和 distinct
- 映射并展平
由于结构众所周知且简单,似乎应该有一个同样简单的解决方案。 哪种方法或其他方法是最简单的方法?
其他说明
- id1-id2 对的顺序仅对变化检测很重要
- 结果列表中的顺序并不重要
- DataFrame 在 10k 到 100k 行之间
- distinct 在结果列表中很好,但不是必需的;假设对于不同的操作是微不足道的
尝试以下操作,将所有行转换为序列,然后收集所有行,然后展平数据并删除空值:
val df = Seq(("A","B"),(null,"A")).toDF
val result = df.rdd.map(_.toSeq.toList)
.collect().toList.flatten.toSet - null
如何将一个简单的(即没有嵌套结构的)数据帧展平为一个列表? 我的问题集是从 table 节点对中检测 changed/added/removed 的所有节点对。
这意味着我有一个 "before" 和 "after" table 可以比较。组合前后数据框产生的行描述了一对出现在一个数据框中而不是另一个数据框中的位置。
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 和 distinct
- 映射并展平
由于结构众所周知且简单,似乎应该有一个同样简单的解决方案。 哪种方法或其他方法是最简单的方法?
其他说明
- id1-id2 对的顺序仅对变化检测很重要
- 结果列表中的顺序并不重要
- DataFrame 在 10k 到 100k 行之间
- distinct 在结果列表中很好,但不是必需的;假设对于不同的操作是微不足道的
尝试以下操作,将所有行转换为序列,然后收集所有行,然后展平数据并删除空值:
val df = Seq(("A","B"),(null,"A")).toDF
val result = df.rdd.map(_.toSeq.toList)
.collect().toList.flatten.toSet - null