首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spark group-包含地图的数据集中的聚合

Spark group-包含地图的数据集中的聚合
EN

Stack Overflow用户
提问于 2021-02-24 22:46:15
回答 1查看 81关注 0票数 1

我有一个java POJO

代码语言:javascript
复制
class MyObj{
  String id;
  Map<KeyObj, ValueObj> mapValues;
  //getters and //setters(omitted)
}

我有一个spark数据集

代码语言:javascript
复制
Dataset<MyObj> myDs = .....

我的数据集有一个值列表,但有重复的Ids。如何使用Spark groupBy组合重复的帐户Id并将键值对聚合到该Id的一个映射中。谢谢你的帮助。

所以我有:

代码语言:javascript
复制
ID.     Map
----------------------------------
1000   [(w -> wer), (D -> dfr)]
1000   [(g -> gde)]
1001   [(k -> khg), (v -> vsa)]

我需要这个:

代码语言:javascript
复制
ID.   Map
----------------------------------
1000   [(w -> wer), (D -> dfr), (g -> gde)]
1001   [(k -> khg), (v -> vsa)]
EN

回答 1

Stack Overflow用户

发布于 2021-02-26 04:31:14

您可以对原始映射执行explode操作,以便每个映射的每个条目都是它自己的一行。然后,您可以对id列进行分组并使用map_from_arrays恢复地图

代码语言:javascript
复制
myDs.select(col("id"),explode(col("mapValues"))) //1
   .groupBy("id")
   .agg(collect_list("key").as("keys"), collect_list("value").as("values")) //2
   .withColumn("map", map_from_arrays(col("keys"), col("values"))) //3
   .drop("keys", "values") //4
   .show(false);

将映射

  1. explode到单行中。新的列名将是keyvalue
  2. When grouping by id
  3. Use map_from_arrays将所有键和值分组到数组中,从而产生一个包含键的数组和一个包含值的数组,以将键和值数组转换回单个映射
  4. drop

结果是

代码语言:javascript
复制
+----+------------------------------+
|id  |map                           |
+----+------------------------------+
|1000|[D -> dfr, w -> wer, g -> gde]|
|1001|[v -> vsa, k -> khg]          |
+----+------------------------------+
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66353190

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档