这是稍微简化了的一个代码片段,这个函数每次要根据 dayid 调用 getList, 本质上是去 hive 里读取对应的 partition 然后做后续计算. 但是这个函数可能在一个 job 中以相同的 dayid 被调用多次(也可能是其他 dayid). 所以为了让被 cache 的 rdd 被重复使用,我想把 dayid&rdd 保存到一个 HashMap 里. UserFilter 是一个伴生对象, rddMap 是一个伴生对象里的mutable.Map. 但是根据打印的日志, dayid&listRDD并没有被成功插入到rddMap 里.写这段代码之前确实也觉得可能不能成功,在我理解,毕竟 RDD 并不是内存里一个对象,而是定义了计算出这个 RDD 的计算流. 那么想要实现我想要做的功能应该怎么写?
var listRDD: RDD[(Int, None.type)] = sc.emptyRDD
if (UserFilter.rddMap.get(dayid) == None) {
listRDD = getList(hc, dayid).map(userid => (userid, None))
listRDD.cache()
UserFilter.rddMap.+((dayid, listRDD))
LOGGER.info("The size of map:" + UserFilter.rddMap.size)
} else {
listRDD = UserFilter.rddMap.get(dayid).get
}