我有一个RDD,它有地图作为其元素。当然,我不能使用RDD.get。因此,截至目前,我执行以下操作以从此映射获取键的值:
val x = RDD.collect().flatten.toMap
然后
x.get(key)
获取密钥的值。现在,有一个非常大的rdd输出错误java.lang.OutOfMemoryError: GC overhead limit exceeded
,因为我在rdd上应用.collect()。如果不在rdd上应用.collect(),我怎么能这样做?
答案 0 :(得分:2)
如果确实是Map
s,那么您可以执行以下操作:
rdd.flatMap(identity).lookup(key)
虽然这仍然会输出到驱动程序,但只输出该键的值。所以,如果它能够适合记忆,那么你就是好的。但是如果你想继续使用rdd那么:
rdd.flatMap(identity)
.flatMap{case (key, value) => if(key == myKey) Some(value) else None}
如果您想要键值和值,那么您可以将flatMap
转换为过滤器,只需过滤key == myKey
答案 1 :(得分:0)
由于您无法将所有内容都安装到驱动程序上,因此首先需要为需要查看的地图过滤RDD,然后执行get ...
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