Spark DataFrame数组列转换为长表的实现方法
嘿,我来帮你搞定Spark DataFrame里数组列转长表的问题!这其实是个非常常见的需求,用Spark内置的explode函数就能轻松实现,我给你分Python和Scala两种常用场景举例说明,一看就懂~
先看效果对比
输入DataFrame(含数组列)
| id | name | hobbies |
|---|---|---|
| 1 | Alice | [读书, 跑步, 画画] |
| 2 | Bob | [篮球, 游泳] |
转换后的长表格式
| id | name | hobby |
|---|---|---|
| 1 | Alice | 读书 |
| 1 | Alice | 跑步 |
| 1 | Alice | 画画 |
| 2 | Bob | 篮球 |
| 2 | Bob | 游泳 |
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
相关产品推荐
相关产品推荐

