scala - 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}
潜在方法:
- 将所有列分别并不同地合并
- flatMap 和不同的
- 映射并展平
由于该结构众所周知且简单,因此似乎应该有一个同样简单的解决方案。哪种方法或其他方法是最简单的方法?
其他注意事项
- id1-id2 对的顺序仅对更改检测很重要
- 结果列表中的顺序并不重要
- DataFrame 在 10k 到 100k 行之间
- 结果列表中的 distinct 很好,但不是必需的;假设对于不同的操作是微不足道的
解决方案
尝试以下操作,将所有行转换为 seqs,然后收集所有行,然后展平数据并删除空值:
val df = Seq(("A","B"),(null,"A")).toDF
val result = df.rdd.map(_.toSeq.toList)
.collect().toList.flatten.toSet - null
推荐阅读
- java - 在 Windows 10 中检测虚拟桌面
- javascript - 能够在音频播放器上选择起点和终点
- excel - MSBI Merge:如何将 Excel 文件与 SSIS 中的测试文件合并?
- python - 获取streamlit中上传文件的原名
- azure - 如何从事件网格中获取成功部署 Azure 模板的事件
- c# - 如何在检查器中创建文本/字符串容器以添加描述/信息文本以及如何适应并将其转换为 ui 文本组件?
- python - 什么是实现图像跟随光标快速移动的好方法?
- amazon-web-services - 为什么我的 aws-cli 构建在构建时可以在中间容器上工作,但不能在最终容器上工作?
- java - 为什么 startActivityForResult 没有显示在回收器视图适配器中?
- swift - SwiftUI AnyTransition.animation 在使用 .offset 时不会覆盖动画参数