如何对 spark scala RDD 中的元组列表/数组执行转换?

Posted

技术标签:

【中文标题】如何对 spark scala RDD 中的元组列表/数组执行转换?【英文标题】:How to perform transformations on list/array of tuples in spark scala RDD? 【发布时间】:2021-08-21 16:13:21 【问题描述】:

我有一个元组列表 - 如何对每个元组的整数值执行 reduce?

val student=List((1,"akshay",60),(2,"salman",70),(3,"ranveer",50))
val student_rdd=sc.parallelize(student)
rdd1.reduce((a,b)=>(a._3+b._3)).collect

error: type mismatch;
found: Int
required: (Int, String, Int)

【问题讨论】:

您希望第一列和第二列发生什么?例如。 (1, "akshay", 60) 和 (2, "salman", 70) 应该变成 (X, Y, 130)。你希望 X 和 Y 在那里? 您是否只是在查找第 3 列中所有值的总和? 我想计算元组中最后一个值的总和、最小值、最大值、平均值。 【参考方案1】:

您可以在减少之前映射值。其他列对于归约不是必需的,应在归约前删除。

student_rdd.map(_._3).reduce(_+_)

【讨论】:

您的解决方案仅适用于 sum,如果我想要 min 和 max 怎么办? 然后在reduce中使用_ min __ max _ student_rdd.map(._3).reduce(_min) -> 错误:未找到:值min _min 之间需要一个空格【参考方案2】:

有比使用 RDD 更好的方法,但是如果您想使用 reduce 一次性获得 sum、min、max、avg,那么这将起作用

val res = 
  val a = student_rdd.map(r => (r._3, r._3, r._3, 1))
    .reduce((a, b) => (a._1 + b._1, Math.min(a._2, b._2), 
      Math.max(a._3, b._3), a._4 + b._4))
  a.copy(_4 = a._1 * 1.0 / a._4)

这为您提供了一个包含 (sum, min, max, avg) 的元组

【讨论】:

以上是关于如何对 spark scala RDD 中的元组列表/数组执行转换?的主要内容,如果未能解决你的问题,请参考以下文章

如何将地图转换为 Spark 的 RDD

从 pandas 数据框中的元组列中删除元素

spark的Pair RDD的转化操作

来自 RDD 映射的 Spark Scala 序列化错误

如何使用scala对spark中rdd的每一行进行排序?

Spark:对 RDD 中的高效批量查找