PySpark中如何将二维数组列转换为结构体数组类型列
PySpark数组转数组套结构体实现方案
实现逻辑
使用PySpark内置的transform高阶函数处理动态长度数组,它会遍历contact_persons数组内的每一个子数组元素,再将子数组按位置取对应值打包为目标结构体即可,完全适配任意长度的联系人数组。
代码实现
首先导入依赖:
from pyspark.sql import functions as F
核心转换代码:
# 写法1:Python lambda写法,适配PySpark 3.1及以上版本 df_transformed = df.withColumn( "contact_persons", F.transform( "contact_persons", lambda contact_arr: F.struct( contact_arr[1].alias("emails"), contact_arr[0].alias("name"), contact_arr[2].alias("phone"), contact_arr[3].alias("roles") ) ) ) # 写法2:SQL表达式写法,兼容所有支持transform的低版本PySpark df_transformed = df.withColumn( "contact_persons", F.expr(""" transform(contact_persons, x -> struct( x[1] as emails, x[0] as name, x[2] as phone, x[3] as roles ) ) """) )
验证结果
执行后打印schema即可确认转换成功:
df_transformed.printSchema()
输出的schema和需求完全一致。
注意:需要保证每个联系人子数组的元素顺序固定,即索引0为姓名、索引1为邮箱、索引2为电话、索引3为角色,否则会出现字段取值错位的问题。
内容的提问来源于stack exchange,提问作者yahoo
相关产品推荐
相关产品推荐

