我正在寻找具有以下签名的功能:
bind[A, B](f: A => Dataset[B], ds: Dataset[A]): Dataset[A]
火花库里有这样的东西吗? (flatMap
遗憾的是需要从A
到TraversableOnce[B]
的映射,这意味着我必须具体化我的数据集,除非我遗漏了某些内容)。
如果没有,那么如何实现这样的功能呢?
答案 0 :(得分:4)
RDD
不是monad。
RDD
对象仅对驱动程序有意义,并且对工作程序执行map/flatmap
个函数。因此,您无法在地图/平面地图操作中发出RDD
。
Dataset
是RDD
的外观所以我想这也是不可能的。
答案 1 :(得分:1)
假设您有N
个节点,每个节点上有M
个内存。
此外,假设f(a)
与所有a <- ds
的大小大致相同。
您说您希望f(a)
成为分布式Dataset
。您坚持f
返回Dataset
的唯一原因是返回的值不适合单个节点的内存,因此
|f(a)| >= M .
同时你假设bind(f, ds)
适合记忆,因此
N * M >= ds.size * |f(a)| >= ds.size * M
如果我们取消M
,则会说:
N >= ds.size
也就是说,ds
中的元素数量必须相对较小(小于计算节点的数量)。这反过来意味着您可以简单地在主节点上收集它,将其映射到数据集,然后获取联合。沿着这些方向的东西(未经测试):
def bind[A, B](f: A => Dataset[B], ds: Dataset[A]): Dataset[A] = {
ds.collect.map(f).reduce(_ union _)
}
尝试将其变成一般的monad并没有多大意义,因为如果你将Dataset
读成&#34;庞大的分布式数据集几乎不适合具有多个节点的大型集群&#34;,那么< / p>
ds
已经很大了f(a)
都很大ds.flatMap(f)
对于2的力量是巨大的,不适合记忆因此,一般bind
可以是:
fold(f: A => TraversableOnce[B])
,因为f(a)
很小ds.collect
,因为ds
很小你是那个必须做出决定的人,那就是那个小小的&#34;在每个特定情况下。这可能是没有提供通用flatMap(f: A => Dataset[B])
的原因:必须在每次调用此类flatMap
时做出非平凡的设计决策。