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

Spark DataFrame数组列转换为长表的实现方法

嘿,我来帮你搞定Spark DataFrame里数组列转长表的问题!这其实是个非常常见的需求,用Spark内置的explode函数就能轻松实现,我给你分Python和Scala两种常用场景举例说明,一看就懂~

先看效果对比

输入DataFrame(含数组列)

idnamehobbies
1Alice[读书, 跑步, 画画]
2Bob[篮球, 游泳]

转换后的长表格式

idnamehobby
1Alice读书
1Alice跑步
1Alice画画
2Bob篮球
2Bob游泳

Python 实现代码

直接调用pyspark.sql.functions里的explode函数,就能把数组列的每个元素拆成单独一行:

from pyspark.sql import SparkSession
from pyspark.sql.functions import explode

# 初始化SparkSession
spark = SparkSession.builder.appName("array_to_long_table").getOrCreate()

# 构造示例数据
sample_data = [
    (1, "Alice", ["读书", "跑步", "画画"]),
    (2, "Bob", ["篮球", "游泳"])
]
df = spark.createDataFrame(sample_data, schema=["id", "name", "hobbies"])

# 拆分数组列生成新列,并取别名
long_format_df = df.select("id", "name", explode("hobbies").alias("hobby"))

# 打印结果
long_format_df.show()

Scala 实现代码

逻辑和Python完全一致,只是语法稍有不同:

import org.apache.spark.sql.SparkSession
import org.apache.spark.sql.functions.explode

object ArrayToLongTable extends App {
    // 初始化SparkSession
    val spark = SparkSession.builder.appName("array_to_long_table").getOrCreate()
    
    // 构造示例数据
    val sampleData = Seq(
        (1, "Alice", Seq("读书", "跑步", "画画")),
        (2, "Bob", Seq("篮球", "游泳"))
    )
    val df = spark.createDataFrame(sampleData).toDF("id", "name", "hobbies")
    
    // 拆分数组列
    val longFormatDf = df.select($"id", $"name", explode($"hobbies").alias("hobby"))
    
    // 查看结果
    longFormatDf.show()
}

小细节提醒

如果你的数组列存在空数组的情况,explode会直接过滤掉这些行;要是想保留原行(拆分后对应的值为null),可以替换成explode_outer函数,用法和explode完全一致哦。

内容的提问来源于stack exchange,提问作者Fisseha Berhane

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 06:22:48