我有一个包含HBase行键的RDD。 RDD相对较大以适应内存。我需要为每个提供的密钥获取RDD值。有没有办法做这样的事情:
keys.map(key => table.get(new Get(key)))
所以问题是如何获取HTable内部地图任务的实例?我应该为每个分区实例化HConnection,然后从中获取HTable实例,还是有更好的方法?
答案 0 :(得分:0)
您可以做几个选项,但首先要考虑一下火花确实不允许您创建RDD的RDD。所以真的让你有两个选择
我强烈推荐第二个,因为RDD的列表可能会结束,你需要执行大量的减少,这可能会大量增加你需要执行的shuffle数量。考虑到这一点,我建议你使用flatMap。
所以这里有一些基本的骨架代码可以帮助你获得结果
val input:RDD[String]
val completedRequests:RDD[(String, List[String]) = input.map(a => (a, table.get(new Get(a)))
val flattenedRequests:RDD[(String, String) = completedRequests.flatMap{ case(k,v) => v.map(b =>(k,b))
您现在可以将RDD作为一个对象处理,如果您需要一个特定的信息,则可以使用reduceByKey,现在spark将能够以最佳的并行性访问数据。
希望有所帮助!