Spark 2.4中调整ArrayType列内StructField的字段顺序
解决Spark 2.4中数组结构体字段顺序调整问题
你之前尝试的cast方法之所以会导致值与字段名不匹配,是因为Spark的cast操作是按结构体字段的位置而非名称进行映射的。原结构体的字段顺序是email -> id -> name,你cast后的新结构体顺序是name -> id -> email,所以原第一个字段email的值会被直接赋值给新结构体的第一个字段name,这就出现了值错位的问题。
要正确调整数组中结构体的字段顺序并保证值对应正确,需要遍历数组中的每个结构体,按指定顺序重新构造结构体,而非直接强制类型转换。在Spark 2.4中可以使用transform高阶函数实现这个需求,具体代码如下:
import org.apache.spark.sql.functions.{transform, struct, to_json, col} // 重新构造数组内的结构体,指定字段顺序 val transformedDF = df.withColumn( "StudentDetails", to_json( transform( col("StudentDetails"), student => struct( student("name").alias("name"), student("id").alias("id"), student("email").alias("email") ) ) ) )
代码说明:
transform(col("StudentDetails"), student => ...):遍历StudentDetails数组中的每个结构体元素(命名为student)。struct(student("name"), student("id"), student("email")):对每个结构体,按name -> id -> email的顺序提取原字段的值,构造新的结构体。这里的alias可以省略,因为字段名和原字段名一致。to_json(...):将调整后的数组结构体列转换为JSON字符串,最终得到你需要的字段顺序和对应值。
执行这段代码后,输出的JSON结果会是:
[{"name":"abc","id":11,"email":"abc@xyz.com"}]
内容的提问来源于stack exchange,提问作者Abhinay
相关产品推荐
相关产品推荐

