迭代RDD元素

时间:2015-04-17 06:55:06

标签: scala apache-spark rdd

我有这种类型的RDD:(String,(Iterable [(String,Int)],Double))。我想对此进行转换,以便我可以使用以下类型的新RDD:(String,(Iterable [(String,Int)],Double))其中原始iterable中的每个Int乘以Double。怎么会这样呢?我的大部分遭遇导致单位RDD没有任何实际数据。

2 个答案:

答案 0 :(得分:2)

这似乎做你想要的。它编译,我没有运行它的数据集。

def method(src: RDD[(String, (Iterable[(String, Int)], Double))]) = {
    src.map {
      case (s, (iter, d)) =>
         (s, (iter.map { case (s, i) => (s, (i * d).toInt) }, d))
    }
  }

或者mapValues可能更有效,因为它不会影响分区:

 def method(src: RDD[(String, (Iterable[(String, Int)], Double))]) = {
    src.mapValues {
      case (iter, d) =>
         (iter.map { case (s, i) => (s, (i * d).toInt) }, d)
    }
  }

答案 1 :(得分:-1)

您可以使用RDD.mapValues将给定函数应用于键为常量的所有值。

    def transformRdd(in: RDD[(String, (Iterable[(String, Int)], Double))]) := RDD[(String, (Iterable[(String, Int)], Double))]{
  in.mapValues{ 
//Here a will be iterable and b is Double
  case (a, b) => (a.map { case (str, int) => (str, (int * b).toInt) }, b)
  }

现在它可以工作......检查这是否编译。