如何在Spark DataFrame中选择嵌套结构并保留其层级
保留Spark DataFrame嵌套结构的Select操作方法
问题描述
原始DataFrame的数据结构如下:
key my_id1 my_id2 value my_value1 my_value2
需要保留my_id1、my_id2和my_value2,同时维持原有的嵌套结构,但执行以下代码后:
val myDf = myoriginalDF .select("key.*", "value.my_value2")
得到的是扁平化结构:
my_id1 my_id2 my_value2
如何在select操作中保留嵌套结构?
解决方案
要保留嵌套层级,需要用struct()函数重新构建嵌套字段,而不是直接展开或单独提取。具体代码如下:
import org.apache.spark.sql.functions.struct val myDf = myoriginalDF .select( struct("key.my_id1", "key.my_id2").alias("key"), struct("value.my_value2").alias("value") )
代码说明
struct("key.my_id1", "key.my_id2")将指定字段重新组合成名为key的嵌套结构体,还原原始层级struct("value.my_value2")同理,构建只包含my_value2的value嵌套结构体- 用
alias()给结构体命名,和原始结构保持一致
执行后得到的结果结构如下,仅保留需要的字段且嵌套层级不变:
key my_id1 my_id2 value my_value2
也可以分两步实现,先提取目标字段再重组结构:
val myDf = myoriginalDF .select("key.my_id1", "key.my_id2", "value.my_value2") .select( struct("my_id1", "my_id2").alias("key"), struct("my_value2").alias("value") )
效果和第一种方法完全一致。
内容的提问来源于stack exchange,提问作者olaf
相关产品推荐
相关产品推荐

