scala - 将 Spark 数据框列的不同值转换为列表
问题描述
我有一个看起来像这样的数据集:
+-------+-----+----------+--------------+
| Name | Age | Pet Name | Phone Number |
+-------+-----+----------+--------------+
| Brett | 14 | Rover | 123 456 7889 |
| Amy | 15 | Ginger | 123 456 8888 |
| Amy | 15 | Polly | 123 456 8888 |
| Josh | 14 | Fido | 312 456 9999 |
+-------+-----+----------+--------------+
我需要使用 Spark 以以下格式呈现它:
+-------+-----+---------------+--------------+
| Name | Age | Pet Name | Phone Number |
+-------+-----+---------------+--------------+
| Brett | 14 | Rover | 123 456 7889 |
| Amy | 15 | Ginger, Polly | 123 456 8888 |
| Josh | 14 | Fido | 312 456 9999 |
+-------+-----+---------------+--------------+
有人可以帮助我解决这个问题的最佳方法吗?
解决方案
您还可以使用 groupBy Name 和 Age 并收集为 Pet Name 列表,如下所示
df.groupBy("Name", "Age")
.agg(collect_list($"Pet Name").as("PetName"), first("Phone Number").as("PhoneNumber"))
或者你也可以这样做
data.groupBy("Name", "Age", "Phone Number")
.agg(collect_list($"Pet Name").as("PetName"))
输出:
+-----+---+---------------+------------+
|Name |Age|PetName |PhoneNumber |
+-----+---+---------------+------------+
|Amy |15 |[Ginger, Polly]|123 456 8888|
|Brett|14 |[Rover] |123 456 7889|
|Josh |14 |[Fido] |312 456 9999|
+-----+---+---------------+------------+
如果你需要字符串,你可以使用concat_ws
as
data.groupBy("Name", "Age", "Phone Number")
.agg(concat_ws(",",collect_list($"Pet Name")).as("PetName"))
输出:
+-----+---+------------+------------+
|Name |Age|Phone Number|PetName |
+-----+---+------------+------------+
|Brett|14 |123 456 7889|Rover |
|Amy |15 |123 456 8888|Ginger,Polly|
|Josh |14 |312 456 9999|Fido |
+-----+---+------------+------------+
推荐阅读
- c - 使用gets C程序时程序崩溃
- android - 应用程序名称更正
- flutter - 必须向 Text 小部件提供非空字符串。'package:flutter/src/widgets/text.dart':
- c# - 在 .NET 控制台应用程序中为 Kestrel WebHost 构建器配置 SSL 证书
- javascript - Javascript Date and time
- c++ - Paho C(ARM)的交叉编译问题
- macos - 物理 USB 集线器后面的 Mac OSX USB 串行端口
- go - 重新订阅 Kafka-topic 并仅获取新消息
- arrays - Matlab中的Repmat复制特定元素
- random - Erlang:关于分布,有没有更优雅的方法来获取特定范围内的随机整数