Создайте JSON, объединив фреймы данных (родитель и потомок) - PullRequest
0 голосов
/ 06 сентября 2018

Я хотел бы создать json из 2-х фреймов данных (один родительский, а другой дочерний). Дочерние записи должны быть массивом, формирующим вложенный 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" }
   ]
}

Цените ваши мысли. Спасибо

1 Ответ

0 голосов
/ 06 сентября 2018

Сначала объедините два кадра данных:

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")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...