json - 收集Json中DataFrame列的数据
问题描述
我有一个 DataFrame 有两列作为“键”:id1
和id2
:
val df1 = Seq(
(1, 11, "n1", "d1"),
(1, 22, "n2", "d2"),
(2, 11, "n3", "d3"),
(2, 11, "n4", "d4")
).toDF("id1", "id2", "number", "data")
scala> df1.show
+---+---+------+----+
|id1|id2|number|data|
+---+---+------+----+
| 1| 11| n1| d1|
| 1| 22| n2| d2|
| 2| 11| n3| d3|
| 2| 11| n4| d4|
+---+---+------+----+
我想得到 Json,按数据框的键分组,如下所示:
+---+---+-------+----------------------------------------------------------+
|id1|id2| json |
+---+---+-------+----------------------------------------------------------+
| 1| 11|[{"number" : "n1", "data": "d1"}] |
| 1| 22|[{"number" : "n2", "data": "d2"}] |
| 2| 11|[{"number" : "n3", "data": "d3"}, {"number" : "n4", "data": "d4"}]|
+---+---+-------+----------------------------------------------------------+
版本:
Spark: 2.2
Scala: 2.11
解决方案
这可以通过首先使用to_json
将number
anddata
列转换为 json 格式来完成。然后在两个 id 列上使用groupBy
withcollect_list
来获得想要的结果。
val df2 = df1.withColumn("json", to_json(struct($"number", $"data")))
.groupBy("id1", "id2").agg(collect_list($"json"))
推荐阅读
- c# - 在 C# 中针对浮点数验证整数值
- postgresql - 如何在 Postgresql 中更改 Effective_io_concurrency
- javascript - 如何使用 Ajax 调用在 API 中动态调用 ActionResult?
- api - Postman 请求 - 如何根据 API 文档从端点获取数据
- python - 将混合分隔和非分隔数据写入 csv 文件
- node.js - mongodb push 如果键存在否则设置数组
- laravel - Laravel 8通过api客户端发送mailgun错误:未经授权的响应:禁止
- php - Prestashop 中的 Linkwise Affiliate 集成
- c - ENXIO(没有这样的设备或地址)试图打开 /sys/bus/usb/devices/xxx 虽然相应的文件存在
- ros - 为什么这个错误是怎么回事(构建 ROS 包)?