Сначала объедините два кадра данных:
val df = df1.join(df2, Seq("dept_Id"))
Затем используйте groupBy
и collect_list
. Здесь используются два класса case, чтобы получить правильные имена в окончательном 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")