假设我有一个具有以下类型的RDD:
RDD[(Long, List(Integer))]
我可以假设整个列表位于同一个工作人员处吗?我想知道某些操作在RDD级别上是否可接受,或者是否应在驱动程序中计算。例如:
val data: RDD[(Long, List(Integer))] = someFunction() //creates list for each timeslot
请注意,List
可能是aggregate
或任何其他操作的结果,不一定是一件作品。
val diffFromMax = data.map(item => (item._1, findDiffFromMax(item._2)))
def findDiffFromMax(data: List[Integer]): List[Integer] = {
val maxItem = data.max
data.map(item => (maxItem - item))
}
问题是List
分布式计算maxItem
可能会导致大量网络流量。这可以是具有以下类型的RDD的句柄:
RDD[(Long, Integer /*Max Item*/,List(Integer))]
最大项目是在司机处计算的。
所以问题(实际上是2个问题)是:
((Long, Integer), Double)
?答案 0 :(得分:3)
简短的回答是肯定的,你的名单将位于一名工人身上。
您的元组是RDD中的单个记录。单个记录总是在单个分区上(可以在单个工作者上)。 当你执行findDiffFromMax时,你在目标worker上运行它(因此该函数被序列化为所有要运行的worker)。
你应该注意的是,当你生成一个(k,v)元组时,这意味着一个键值对,这样你就可以对RDD进行基于键的操作了。顺序((长,(强,双))与((长,字符串),双)或任何其他方式)并不重要,因为它只是一条记录。唯一重要的是哪个是关键操作的关键,所以问题就是计算的逻辑