You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从Spark DataFrame的层级关系生成指定格式的字典

Spark DataFrame转换为管理者-下属字典

问题描述

我拥有如下Spark DataFrame:

schema = 'EMPLOYEE_NUMBER int, MANAGER_EMPLOYEE_NUMBER int'
employees = spark.createDataFrame(
[[801,None], 
[1016,801], 
[1003,801], 
[1019,801], 
[1010,1003], 
[1004,1003], 
[1001,1003],
[1012,1004], 
[1002,1004], 
[1015,1004], 
[1008,1019], 
[1006,1019], 
[1014,1019],
[1011,1019]], schema=schema)

希望从该DataFrame生成类似{801:[1003,1019,1016], 1019:[1014,1011,1008,1006], 1003:[1010,1001,1004]}的字典,是否可以实现?

解决方案

完全可以实现,步骤如下:

  • 过滤并分组数据:先过滤掉MANAGER_EMPLOYEE_NUMBER为null的行(这类是顶层管理者,无需作为下属被收集),再按管理者编号分组,收集对应下属的员工编号列表。
  • 转换为字典:将分组后的Spark DataFrame转换为Python字典。

具体代码

from pyspark.sql import functions as F

# 分组收集下属员工编号列表
grouped_df = employees.filter(employees.MANAGER_EMPLOYEE_NUMBER.isNotNull()) \
    .groupBy("MANAGER_EMPLOYEE_NUMBER") \
    .agg(F.collect_list("EMPLOYEE_NUMBER").alias("subordinates"))

# 转换为Python字典
result_dict = dict(grouped_df.rdd.map(lambda row: (row.MANAGER_EMPLOYEE_NUMBER, row.subordinates)).collect())
print(result_dict)

补充说明

  • collect_list会保留数据原有顺序,若需要对下属列表排序,可在收集前添加orderBy,或对列表手动排序:
# 排序后的版本
grouped_df = employees.filter(employees.MANAGER_EMPLOYEE_NUMBER.isNotNull()) \
    .orderBy("EMPLOYEE_NUMBER") \
    .groupBy("MANAGER_EMPLOYEE_NUMBER") \
    .agg(F.collect_list("EMPLOYEE_NUMBER").alias("subordinates"))
  • 也可通过转换为Pandas DataFrame再生成字典:
import pandas as pd
result_dict = grouped_df.toPandas().set_index("MANAGER_EMPLOYEE_NUMBER")["subordinates"].to_dict()

运行后即可得到符合需求的管理者-下属映射字典。

内容的提问来源于stack exchange,提问作者Jeevan Kande

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 21:36:29