You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Scala中展开Spark DataFrame的列表列为多行

如何将Spark DataFrame中的数组列展开为多行?

刚好这个需求是Spark数据处理里非常常见的场景,我们可以用Spark内置的explode函数来快速实现数组列的展开,下面是具体的Scala代码实现:

1. 基础实现(使用explode)

首先需要导入explode函数:

import org.apache.spark.sql.functions.explode
import org.apache.spark.sql.functions.col // 可选,用来更清晰地引用列

然后你可以通过两种方式生成目标DataFrame:

方式一:直接用select展开

这种方式直接选择需要保留的列,同时将数组列展开并重命名:

val expandedDF = articledDF.select(
  col("article"),
  explode(col("topics")).alias("topic")
)

方式二:用withColumn添加列后删除原数组列

如果你需要先保留原数组列做其他操作,或者更习惯这种分步写法:

val expandedDF = articledDF
  .withColumn("topic", explode(col("topics"))) // 添加展开后的topic列
  .drop("topics") // 删除原来的topics数组列

运行上面的代码后,你就能得到想要的结果:

+---------+-----------+
| article | topic     |
+---------+-----------+
|article 1| topic 1   |
|article 1| topic 2   |
|article 2| topic 1   |
|article 2| topic 3   |
|article 3| topic 2   |
+---------+-----------+

2. 处理空数组的边界情况

如果你的DataFrame中存在topics列为空数组的行,explode会直接过滤掉这些行。如果想要保留这些行(对应的topic列会显示为null),可以用explode_outer函数替代:

import org.apache.spark.sql.functions.explode_outer

val expandedDF = articledDF.select(
  col("article"),
  explode_outer(col("topics")).alias("topic")
)

这样即使某篇文章没有任何topic,也会在结果中保留一行,topic字段为null。

内容的提问来源于stack exchange,提问作者Mor Shemesh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:13:47