我有这种类型的RDD:(String,(Iterable [(String,Int)],Double))。我想对此进行转换,以便我可以使用以下类型的新RDD:(String,(Iterable [(String,Int)],Double))其中原始iterable中的每个Int乘以Double。怎么会这样呢?我的大部分遭遇导致单位RDD没有任何实际数据。
答案 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)
}
现在它可以工作......检查这是否编译。