首页 文章

从 Scala 中的 rdd 地图获取键的值

提问于
浏览
1

我有一个以地图为元素的 RDD。我当然不能使用 RDD.get。因此,到目前为止,我执行以下操作以从此映射中获取键的值:

val x = RDD.collect().flatten.toMap

接着

x.get(key)

获取密钥的值。现在,拥有一个很大的 rdd,因为我在 rdd 上应用.collect()时会输出错误java.lang.OutOfMemoryError: GC overhead limit exceeded。不在 rdd 上应用.collect()怎么办?

2 回答

  • 2

    如果确实是Map s,则可以执行以下操作:

    rdd.flatMap(identity).lookup(key)
    

    尽管这仍将输出到驱动程序,但仅来自该键的值。因此,如果可以将其存储在内存中,那么您对此表示满意。但是,如果您仍然想将其作为 rdd 使用,则:

    rdd.flatMap(identity)
       .flatMap{case (key, value) => if(key == myKey) Some(value) else None}
    

    并且如果您想要键 AND 值,则可以将flatMap转换为过滤器,然后仅对key == myKey进行过滤

  • 0

    由于您无法将所有内容都安装到驱动程序中,因此您首先需要为需要查看的地图过滤 RDD,然后进行获取...

    val rdd = sc.parallelize(List(Map("a"->1,"b"->2),Map("c"->3,"d"->4)))
    
    val key = "d"
    
    val filteredRDD = rdd.filter(_.keySet contains key)
    
    if (!filteredRDD.isEmpty) filteredRDD.first.get(key) else None
    

相关问题