从scala中的rdd地图获取键值

时间:2017-03-31 14:30:39

标签: scala apache-spark hashmap rdd

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

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

然后

x.get(key)

获取密钥的值。现在,有一个非常大的rdd输出错误java.lang.OutOfMemoryError: GC overhead limit exceeded,因为我在rdd上应用.collect()。如果不在rdd上应用.collect(),我怎么能这样做?

2 个答案:

答案 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