json - 通过加入数据框(父和子)创建 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" }
]
}
欣赏你的想法。谢谢
解决方案
首先将两个数据框连接在一起:
val df = df1.join(df2, Seq("dept_Id"))
然后使用groupBy
和collect_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")
推荐阅读
- sql-server - 负值和正值匹配和更新
- python - Dijkstra 算法实现中的错误
- regex - 非ascii字符未通过java中的正则表达式过滤
- javascript - 咖喱函数导致错误,但如果不咖喱则有效
- arrays - 如何将 Json 对象作为字符串存储在 java 的单列中
- botframework - android 上的团队机器人上没有附件
- html - Chrome 中较长单词的 CSS 连字符问题
- java - 不使用 Java 通过 TCP/IP 发送具有固定标头的 XML 命令
- plot - 如何使用 xmgrace 从对数图计算曲线下面积?
- javascript - 网站中的所有页面链接以打开聊天窗口