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

当具有多个值时遍历RDD键值对

马弘益
2023-03-14

我目前刚接触Spark,正在使用Scala。我在遍历RDD键值对时遇到了一些问题。我得到了一个TSV文件,file1,其中包括国家名称、纬度和经度,到目前为止我得到了;

val a = file1.map(_.split("\t")).map(rec => (rec(1), (rec(11).toDouble, rec(12).toDouble)))

其中,rec(1)是国家名称,rec(11)是经度,rec(12)是纬度。据我所知,a现在是一个键值对,rec(1)是键,rec(11)和rec(12)是值。我已经设法首先测试了这一点_1首先给出第一个键a_2.\u 1给出键的第一个值<代码>a.优先_2.\u 2给出键的第二个值。

我的目标是至少用相同的键获得所有rec(11)和rec(12)的平均值。所以我的想法是将它们相加,然后用该键除以键值对的数目。

有人能帮我下一步该做什么吗?我试过使用mapflatValueMapvalueMapgroupByKey等等,但我似乎无法同时对rec(11)和rec(12)求和。

共有2个答案

章翔宇
2023-03-14

我的目标是至少设法获得具有相同键的所有rec(11)的平均值,并且与rec(12)相同

您可以按以下步骤进行操作(为清楚起见,请发表评论)

a.mapValues(x => (x, 1))    //putting counter to the values of (k, (v1, v2)) as (k, ((v1, v2), 1))
  .reduceByKey{case(x,y) => ((x._1._1+y._1._1, x._1._2+y._1._2), x._2+y._2)}  //summing separately all the values of v1, all the values of v2 and the counter of same key
  .map{case(x, y)=> (x, (y._1._1/y._2, y._1._2/y._2))}  //finding the average i.e. deviding the sum of v1 and v1 by counter sum separately

这些都在https://stackoverflow.com/a/49166009/5880706

万喜
2023-03-14

您可以使用groupByKeyagg操作avg

这是一个快速示例:

原始DF:

+------------+-----+
|country code|pairs|
+------------+-----+
|          ES|[1,2]|
|          UK|[2,3]|
|          ES|[4,5]|
+------------+-----+

执行操作:

df.groupBy($"country code").agg(avg($"pairs._1"), avg($"pairs._2"))

结果:

+------------+-------------+-------------+
|country code|avg(pairs._1)|avg(pairs._2)|
+------------+-------------+-------------+
|          ES|          2.5|          3.5|
|          UK|          2.0|          3.0|
+------------+-------------+-------------+
 类似资料:
  • 有时我发现自己复制代码以从Map中提取键和值条目(例如,在测试/调试第三方API时)。 我知道Groovy对此有一些很好的抽象(例如,在groovy地图中获取键),但我只能使用POJ。当然,一定有一种更优雅、更少冗长的方式来做到这一点,Java我的意思是?

  • 问题内容: 我们是否可以用一个键和两个值实现HashMap。就像HashMap一样? 还请告诉我(如果没有办法)通过其他任何方法来实现三个值的存储(以一个为键)的方法,对我有帮助吗? 问题答案: 你可以: 使用具有列表作为值的地图。 创建一个新的包装器类,并将该包装器的实例放置在地图中。。 使用类似类的元组(节省创建许多包装器)。。 并排使用多个地图。 例子 1.使用列表作为值进行映射 这种方法的

  • 问题内容: 我想在Java中实现具有多个值的哈希表,即 并且将返回2倍的值。 我怎样才能做到这一点? 问题答案: 您可以改用Multimap。它在列表中为一个键保留多个值。在commons- collection 和Guava中有实现。 这类似于使用值是列表的Hashmap,但是不必显式创建列表。 自己动手做的同一示例如下所示: 请注意,您可以将Multimap用作构建器,并对其调用asMap以返

  • 问题内容: 给定多个长度可能不同的列表,我想遍历值的所有组合,每个列表中的一项。例如: 然后我想要的输出是: 我想遍历 合并 列表。我该如何完成? 问题答案: 应该可以。 请注意,它返回一个迭代器,因此,如果仅要迭代一次,则无需将其转换为列表。 例如。

  • 问题内容: 我得到了错误。知道我该如何解决吗? 问题答案: Python 2 您需要使用。 请参阅此答案,以获取有关遍历字典的更多信息,例如跨python版本使用using 。 Python 3 由于 Python 3的 是不再支持。使用代替。

  • 我试图使用Laravel构建一个(稍微复杂的)订阅服务。 订阅类型为:20份早餐的早餐订阅,在注册后30天内使用。 例如,如果用户在4月1日注册早餐订阅,他可以选择任何20天,直到4月30日。 我制作了以下表格和相应的模型: 用户模型和表 订阅表和型号 订阅用户透视(?)带有软删除的表 我已经用belongsToMany关系更新了相应的模型 用户: 订阅模式 我需要帮助解决的问题1。数据库/模型结