在包含Map的数据集中按聚合进行分组

cotxawn7  于 2021-07-13  发布在  Spark
关注(0)|答案(1)|浏览(212)

我有一个 java 波乔

class MyObj{
  String id;
  Map<KeyObj, ValueObj> mapValues;
  //getters and //setters(omitted)
}

我有Spark

Dataset<MyObj> myDs = .....

我的数据集有一个值列表,但有重复的ID。如何使用spark groupby组合重复的帐户id并将键值对聚合到该id的一个Map中。谢谢你的帮助。
所以我有:

ID.     Map
----------------------------------
1000   [(w -> wer), (D -> dfr)]
1000   [(g -> gde)]
1001   [(k -> khg), (v -> vsa)]

我需要这个:

ID.   Map
----------------------------------
1000   [(w -> wer), (D -> dfr), (g -> gde)]
1001   [(k -> khg), (v -> vsa)]
t2a7ltrp

t2a7ltrp1#

可以分解原始Map,使每个Map的每个条目都是自己的一行。然后你就可以分组了 id 列并从\u数组还原带有map \u的Map:

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);

将Map分解成单行。新列名将 key 以及 value 按分组时 id 将所有键和值收集到数组中,生成一个包含键的数组和一个包含每个键的值的数组 id 使用来自\数组的Map\将键和值数组转换回单个Map
放下中间柱
结果是

+----+------------------------------+
|id  |map                           |
+----+------------------------------+
|1000|[D -> dfr, w -> wer, g -> gde]|
|1001|[v -> vsa, k -> khg]          |
+----+------------------------------+

相关问题