Spark Scala 按唯一键对值求和

Posted

技术标签:

【中文标题】Spark Scala 按唯一键对值求和【英文标题】:Spark Scala sum of values by unique key 【发布时间】:2021-12-29 01:41:51 【问题描述】:

如果我有影响 item(key) 和 sales(value) 的键值对:

bolt 45
bolt 5
drill 1
drill 1
screw 1
screw 2
screw 3

所以我想获得一个 RDD,其中每个元素都是每个唯一键的值的总和:

bolt 50
drill 2
screw 6

我现在的代码是这样的:

val salesRDD = sc.textFile("/user/bigdata/sales.txt")
val pairs = salesRDD.map(s => (s, 1))
val counts = pairs.reduceByKey((a, b) => a + b)
counts.collect().foreach(println)

但我的结果是这样的:

(bolt 5,1)
(drill 1,2)
(bolt 45,1)
(screw 2,1)
(screw 3,1)
(screw 1,1)

我应该如何编辑我的代码以获得上述结果?

【问题讨论】:

pairs 的意义何在?你为什么首先映射到一个元组? @sinanspd 那么我该如何获得我想要的结果呢? :) 你没有回答我的问题。如果你在你的代码中设置一个像1 这样的值,它必须有意义。您没有正确读取数据。似乎数据不是逗号分隔而是使用空格。因此,您必须拆分读取的行以获得(item, sales) 的元组。现在你有一个(string, 1) 对的列表,其中商品和销售额都存储在字符串中,所以当你尝试减少时,键不匹配 【参考方案1】:

Java 方式,希望您可以将其转换为 scala。看起来你只需要一个 groupby 和 count

  salesRDD.groupBy(salesRDD.col("name")).count();


+-----+-----+
| name|count|
+-----+-----+
| bolt|   50|
|drill|    2|
|screw|   6 |
+-----+-----+

另外, 请使用数据集和数据帧而不是 RDD。你会发现它很方便

【讨论】:

以上是关于Spark Scala 按唯一键对值求和的主要内容,如果未能解决你的问题,请参考以下文章

通过键对元组进行归约和求和

Python:通过每个国家的Json数据中的键求和的值

使用 Spark Scala 对数组元素求和

跨数据集行的数组元素总和 - Spark Scala

如何使用 LINQ 中的键对值从单个字段中获取重复数据?

Scala 使用求和逻辑按属性从列表转换为映射