Spark(Scala):还原DataFrame中explode操作后的结构
还原Spark DataFrame的数组列(从explode后的结构恢复)
没问题,要把explode后的DataFrame还原成初始带数组类型Emails列的结构,你可以用groupBy结合collect_list函数来实现,这正好是explode的反向操作。
具体实现代码(Scala)
import org.apache.spark.sql.functions.collect_list val dfRestored = dfExplode .groupBy("Key", "PassportNum", "Age") // 按所有非Email的列分组,这些列在原数据中是每组唯一的 .agg(collect_list("Email").alias("Emails")) // 把分组内的Email收集成数组,并重命名为原列名Emails
效果说明
执行这段代码后,dfRestored的结构就会和你初始的DataFrame完全一致:
| Key | Emails | PassportNum | Age |
|---|---|---|---|
| 0001 | [Alan@gmail,Alan@hotmail] | passport1 | 23 |
| 0002 | [Ben@gmail,Ben@hotmail] | passport2 | 28 |
注意点
- 确保
groupBy包含所有不需要聚合的列(也就是原数据中每个Key对应的唯一值列),这样分组后不会丢失任何原有信息。 - 如果你的自定义操作可能导致重复的Email,可以用
collect_set代替collect_list来去重,但根据你的描述,这里用collect_list就能准确还原原数组的顺序和内容。
内容的提问来源于stack exchange,提问作者Ignacio Alorre
相关产品推荐
相关产品推荐

