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

Spark 2中提取DataFrame列子元素及转换嵌套数组数据结构方法

在Spark 2中拆分DataFrame嵌套数组列的方法

嘿,这个需求我太熟了!在Spark 2里处理这种嵌套数组的拆分其实没那么复杂,咱们一步步来搞定它:

核心思路

你的products列是数组的数组结构,所以咱们需要两步走:

  1. 先用explode函数把外层的数组"炸开",让每个子数组单独成为一行
  2. 再从每个子数组里提取对应的元素,生成rec_product_PK和rank列

具体实现(分Scala和Python版本)

Scala版本

首先导入需要的函数:

import org.apache.spark.sql.functions.{explode, col}

然后执行拆分操作:

// 第一步:炸开外层数组,得到每个子数组
val explodedDF = df_products.withColumn("product_pair", explode(col("products")))

// 第二步:从子数组中提取元素,生成目标列,最后清理冗余列
val finalDF = explodedDF
  .withColumn("rec_product_PK", col("product_pair").getItem(0).cast("int")) // 确保是整数类型
  .withColumn("rank", col("product_pair").getItem(1).cast("int"))
  .drop("products", "product_pair") // 去掉不需要的中间列

// 查看结果
finalDF.show()

Python版本

同样先导入函数:

from pyspark.sql.functions import explode, col

然后执行操作:

# 第一步:炸开外层数组
exploded_df = df_products.withColumn("product_pair", explode(col("products")))

# 第二步:提取子数组元素,生成目标列并清理冗余列
final_df = exploded_df \
    .withColumn("rec_product_PK", col("product_pair")[0].cast("int")) \
    .withColumn("rank", col("product_pair")[1].cast("int")) \
    .drop("products", "product_pair")

# 查看结果
final_df.show()

注意事项

  • 如果你的products列子数组的元素类型不是整数,记得用cast()转换成你需要的类型(比如字符串就用cast("string"))
  • Spark 2.x里getItem(index)和直接用数组索引col("array_col")[index]都可以用,选你习惯的方式就行

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:49:24