如何向两层嵌套Struct列的指定位置新增字段
在嵌套数组的Struct中指定位置新增字段
你之前的代码错误地把street_2加到了address_list的外层元素结构体里,要实现需求,需要嵌套使用transform,分别处理外层的address_list数组和内层的address数组,重新构造内层结构体并指定字段顺序。
正确代码示例(Scala)
import org.apache.spark.sql.functions.{col, lit, transform, struct} val modifiedDF = df.withColumn( "address_list", // 遍历外层address_list数组的每个元素 transform(col("address_list"), addrListItem => addrListItem.withField( "address", // 遍历内层address数组的每个元素,重新构造结构体 transform(addrListItem.getField("address"), addr => struct( addr.getField("street").alias("street"), lit(null).cast("string").alias("street_2"), // 新增字段,放在street和city之间 addr.getField("city").alias("city"), addr.getField("state").alias("state") ) ) ) ) )
代码说明
- 外层
transform:遍历address_list的每个元素,保留原有的id、active字段,只替换address字段 - 内层
transform:遍历每个address数组元素,用struct重新定义字段顺序,把street_2插入到street和city之间 - 这里
street_2设为null的字符串类型,你可以根据业务需求替换为具体值(比如lit("默认值").cast("string"))
修改后的Schema
root |-- ts: timestamp (nullable = true) |-- address_list: array (nullable = true) | |-- element: struct (containsNull = true) | | |-- id: string (nullable = true) | | |-- active: integer (nullable = true) | | |-- address: array (nullable = true) | | | |-- element: struct (containsNull = true) | | | | |-- street: string (nullable = true) | | | | |-- street_2: string (nullable = true) | | | | |-- city: long (nullable = true) | | | | |-- state: integer (nullable = true)
内容的提问来源于stack exchange,提问作者Venkata
相关产品推荐
相关产品推荐

