首页 > 解决方案 > 将 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 |
+-------+-----+---------------+--------------+

有人可以帮助我解决这个问题的最佳方法吗?

标签: scalaapache-spark

解决方案


您还可以使用 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_wsas

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        |
+-----+---+------------+------------+

推荐阅读