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

在保留多个值的同时计数键的出现次数

计承德
2023-03-14

我在计算一个键的出现次数时遇到了一些问题,同时也保留了几个值。

通常我只会:

val a = file1.map(x => (x, 1)).reduceByKey(_ + _)

它给出了每个关键点的出现次数。

但是,我还希望在计算键的出现次数的同时,保留键每次出现的值。类似这样:

val a = file1.map(x => (x(1), (x(2), 1)).reduceByKey{case (x,y) => (x._1, y._1, x._2+y._2)}

例如:如果键x(1)是一个国家,而x(2)是一个城市,那么我想保留一个国家的所有城市,并知道一个国家有多少个城市。

共有3个答案

司国源
2023-03-14

我建议您使用dataframes以及dataframesrdds优化且易于使用。

但是,如果您想了解reduceByKey的功能(即按照您所说的城市信息保存其他信息),那么您可以执行以下操作

假设您有一个rdd

val rdd = sc.parallelize(Seq(
  ("country1", "city1"),
  ("country1", "city2"),
  ("country1", "city3"),
  ("country1", "city3"),
  ("country2", "city1"),
  ("country2", "city2")
))

您尝试的ReduceByKey需要进行一些修改,因为

rdd.map(x => (x._1, (Set(x._2), 1)))  //I have used Set to get distinct cities (you can use list or arrays or any other collection
  .reduceByKey((x,y)=> (x._1 ++ y._1, x._2 + y._2))  //cities are also summed and counts are also summed

这应该给你

(country2,(Set(city1, city2),2))
(country1,(Set(city1, city2, city3),4))

我希望答案有帮助

如果你想详细学习ReporteByKey可以查看我的详细解答

壤驷穆冉
2023-03-14

在这种情况下,我建议使用数据帧而不是RDD,并使用groupByagg方法。

您可以使用toDF函数轻松地将RDD转换为数据帧,只需确保首先导入隐式。示例假设RDD有两列:

val spark = SparkSession.builder.getOrCreate()
import spark.implicits._

val df = rdd.toDF("country", "city")

然后使用分组依据(groupBy)并聚合所需的值。

df.groupBy("country").agg(collect_set($"city").as("cities"), count($"city").as("count"))
娄森
2023-03-14

将城市的数量和列表放在一起是复杂和多余的。您可以收集所有城市,并在末尾添加大小:

如果您使用数据帧接口,它当然会更容易(假设数据帧(key: Int, City: String)

import org.apache.spark.sql.{ functions => f}
import spark.implicits._
df.groupBy($"key").
   agg(f.collect_set($"city").as("cities")).
   withColumn("ncities", f.size($"cities"))

但您可以对原始rdd执行类似的操作(我假设在输入元组中为(id,city))

rdd.map{ x => (x(0),Set(x(1)))}.
   reduceByKey{ case(x,y) => x ++ y }.
   map { case(x,y:Set[_]) => (x,y, y.size)}
 类似资料:
  • 我似乎正在与光束中的这种模式作斗争。这是一个流式管道。 在高水平上: 消息传入兔子 消息内容包括一个ID和N个S3文件路径 我希望在列出的所有S3文件中产生一些聚合,但结果应该由原始消息键控 向rabbit写一条带有聚合结果的消息,每个传入消息一条 不可避免的是,我最终得到了一些,并希望在上应用一系列,但不要忘记它们最初是由键控的。 我似乎找不到一个通用的“映射KV pcollection的值但保

  • 计算数组中值的出现次数。 每次遇到数组中的某个特定值时,使用 Array.reduce() 来递增计数器。 const countOccurrences = (arr, val) => arr.reduce((a, v) => (v === val ? a + 1 : a + 0), 0); countOccurrences([1, 1, 2, 1, 2, 3], 1); // 3

  • 问题内容: 我需要能够使用读取同一键的多个值。配置文件示例: 使用“标准”将有一个带有值的键。但是我需要解析器读取两个值。 在重复键输入之后,我创建了以下示例代码: 第一部分(带有)读入我们的“常规”配置文件,仅保留其值(覆盖/删除其他值),然后得到以下预期输出: 第二部分()使用我的方法将多个值附加到列表中,但输出是 如何摆脱重复的价值观?我期望的输出如下: 要么 (我不在乎是否每个值都在列表中

  • 我已经被设置了一个任务,这意味着我需要创建一个'3个或更多的骰子游戏‘。我所坚持的是这个游戏所需要的计分系统,它是这样的:“玩家依次掷出所有五个骰子,并为同类中的三个或更好的骰子得分。如果玩家只有同类中的两个,他们可能会重新掷出剩余的骰子,试图提高匹配的骰子值。如果没有匹配的数字被掷出,玩家得分为0。 游戏进行了一定数量的回合(比如50回合),游戏结束时总分最高的玩家是获胜者。“我需要计算出如何将

  • 问题内容: 我正在编写一个项目,该项目从.java文件中捕获Java关键字,并使用地图跟踪事件的发生。过去,我已经成功地使用了类似的方法,但是我似乎无法为我的预期用途采用这种方法。 该代码块应该将关键字添加到键,并在每次出现相同的键时递增该值。到目前为止,它添加了关键字,但是未能正确增加该值。这是一个示例输出: 基本上,它会增加映射中的每个值,而不是应该增加的值。我不确定我是否对此考虑过多。我尝试

  • 我正在尝试计算Pandas数据帧中一个值与另一个值一起出现的次数,并计算每行的次数。 这就是我的意思: 假设我想计算与,我希望结果是: 这里的< code>freq(频率)列表示< code>a列中的值与< code>t列中的值一起出现的次数。 请注意,考虑到我的数据帧的大小,仅计算发生的次数的解决方案将导致错误的频率。 有没有办法在Python中实现这一点?