当前位置: 首页 > 知识库问答 >
问题:

Spark在包含地图的数据集中按聚合分组

苏丰茂
2023-03-14

我有一个java POJO

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

我有一个火花

Dataset<MyObj> myDs = .....

我的数据集有一个值列表,但有重复的Ids。如何组合重复的帐户Ids并使用Spark group pBy将Key值对聚合到一个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)]

共有1个答案

班安平
2023-03-14

可以分解原始贴图,使每个贴图的每个条目都是自己的一行。然后,您可以在id列上分组,并从_数组中使用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);
  1. 将地图分解成单行。新的列名将是keyvalue
  2. 当按id分组时,将所有键和值收集到数组中,导致每个id
  3. 有一个带键的数组和一个带值的数组
  4. 使用map_from_arrays将键和值数组转换回单个映射
  5. 删除中间列

结果是

+----+------------------------------+
|id  |map                           |
+----+------------------------------+
|1000|[D -> dfr, w -> wer, g -> gde]|
|1001|[v -> vsa, k -> khg]          |
+----+------------------------------+
 类似资料:
  • 问题内容: 我有一个包含时间戳名为RDD 时间 长整型: 我正在尝试按值1,值2和时间分组为YYYY-MM-DD。我尝试按演员分组(时间为日期),但随后出现以下错误: 这是否意味着无法按日期分组?我什至尝试添加另一级别的强制转换以将其作为字符串: 哪个返回相同的错误。 我已经读到我可以在RDD上使用gregationByKey,但我不明白如何在几列中使用它并将其转换为YYYY-MM-DD字符串。我

  • 我有一个集合,其中每个文档都有一些公共数据,如用户名和字符级别,但也有一个私有子集合,它有字符的黄金量。 现在我可以查询特定文档的characters collection,但是子collection数据不会返回,所以我需要执行二次查询来检索它。

  • 我正在考虑将dataset1分解为每个“T”类型的多个记录,然后与DataSet2连接。但是你能给我一个更好的方法,如果数据集变大了,它不会影响性能吗?

  • 我需要聚合一个基于1分钟时间间隔的数据集。当我尝试此操作时,它会抛出错误: 我的数据集如下所示 org.apache.spark.sql.AnalysisException:无法解析(datetime,value)中的列名“60秒”;在org.apache.spark.sql.dataset$$anonfun$resolve$1.apply(dataset.scala:216)在org.apach

  • 我正在尝试使用Java流对对象的两个属性进行分组。正如一些答案所证明的那样,这很容易: 例如,上面的代码片段将以以下形式生成地图 其中,一个映射具有UPC代码的键,其值是具有通道标识符键的映射,这些键引用了产品列表。 这很酷,但是如果我不需要嵌套的值作为映射呢?也就是说,我想按ChannelIdentifier组织嵌套集合,但我只关心。映射的值(),而不是映射本身。有没有办法得到符合以下条件的结果

  • 地图数据集 是我们提供给 Highmaps 用户的一系列地图数据集合,可以很方便创建各国,地区及不同级别的地图。对于其他地图软件,也可以利用我们提供的 SVG 或 Geojson 进行修改或生产地图数据。 使用协议 Highmaps 地图数据集 的使用协议和数据来源有关。Admin0 (国家)数据和 Admin1(中国的省份,美国的洲,德国的联邦等)的数据来源是 Natural Earth,其数据