Spark中无需explode如何获取多层嵌套DataFrame的idCode值
无需扁平化DataFrame提取嵌套数组中的idCode
可以通过Spark的高阶数组函数实现,不用explode扁平化整个数据集,同时保留原DataFrame的行数和结构。以下是两种常见场景的实现方式:
场景1:保留原嵌套结构提取idCode
如果需要和原数据的entity→entityType→entityVersion层级对应,提取各层级下的idCode数组:
from pyspark.sql import functions as F # 新增嵌套结构的idCode列 df = df.withColumn( "idCode_nested", F.transform( F.col("event.version.entity"), lambda entity: F.transform( entity.entityType, lambda entity_type: F.transform( entity_type.entityVersion, lambda entity_version: entity_version.idCode ) ) ) )
通过三层transform遍历每一层数组,逐层提取最内层的idCode,最终得到与原数组层级完全匹配的嵌套idCode数组。
场景2:提取所有idCode为一维数组
如果需要把所有嵌套的idCode合并成一个一维数组,可结合transform和flatten实现:
from pyspark.sql import functions as F # 新增一维数组的idCode列 df = df.withColumn( "idCode_flat", F.flatten( F.transform( F.col("event.version.entity"), lambda entity: F.flatten( F.transform( entity.entityType, lambda entity_type: entity_type.entityVersion.idCode ) ) ) ) )
先提取每个entityType下的idCode数组,再通过两层flatten依次合并entityType和entity层级的数组,最终得到所有idCode的一维集合,全程无需explode。
注意事项
- 上述方法要求Spark版本≥2.4(高阶数组函数从2.4版本开始支持)
- 两种方式都不会改变原DataFrame的行数和原有结构,仅新增目标列
内容的提问来源于stack exchange,提问作者Mamaf
相关产品推荐
相关产品推荐

