Spark 2中提取DataFrame列子元素及转换嵌套数组数据结构方法
在Spark 2中拆分DataFrame嵌套数组列的方法
嘿,这个需求我太熟了!在Spark 2里处理这种嵌套数组的拆分其实没那么复杂,咱们一步步来搞定它:
核心思路
你的products列是数组的数组结构,所以咱们需要两步走:
- 先用
explode函数把外层的数组"炸开",让每个子数组单独成为一行 - 再从每个子数组里提取对应的元素,生成
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
相关产品推荐
相关产品推荐

