首页 > 解决方案 > 通过加入数据框(父和子)创建 JSON

问题描述

我想从 2 个数据框(一个是父级,另一个是子级)中创建一个 json。子记录应该是形成嵌套 JSON 的数组

Df1(部门):

+----------+------------+
| dept_Id  | dept_name  |
+----------+------------+
| 10       | Sales      |
+----------+------------+

Df2(员工):

+----------+--------+----------+
| dept_Id  | emp_id | emp_name |
+----------+--------+----------+
| 10       | 1001   | John     |
| 10       | 1002   | Rich     |
+----------+--------+----------+

我希望按如下方式创建 JSON:

{
 "dept_id":"10",
 "dept_name":"Sales",
 "employee":[ 
        { "emp_id":"1001","emp_name":"John" },
        { "emp_id":"1002","emp_name":"Rich" }
   ]
}

欣赏你的想法。谢谢

标签: jsonscalaapache-sparkapache-spark-sql

解决方案


首先将两个数据框连接在一起:

val df = df1.join(df2, Seq("dept_Id"))

然后使用groupBycollect_list。这里使用两个案例类来获取最终 json 中的正确名称。这些应该放在主要方法之外。

case class Department(dept_Id: Int, dept_name: String, employee: Seq[Employee])
case class Employee(emp_id: Int, emp_name: String)

val dfDept = df.groupBy("dept_id", "dept_name")
  .agg(collect_list(struct($"emp_id", $"emp_name")).as("employee"))
  .as[Department]

结果数据框:

+-------+---------+--------------------------+
|dept_id|dept_name|employee                  |
+-------+---------+--------------------------+
|10     |Sales    |[[1002,Rich], [1001,John]]|
+-------+---------+--------------------------+

最后,将其保存为 json 文件:

dfDept .coalesce(1).write.json("department.json")

推荐阅读