是Spark流
DSTREAM提供的union
两种类型两种类型工会之间有什么不同:是Spark流
StreamingContext.union(Dstreams)
Dstream.union(anotherDstream)
所以我想知道什么是不同的,尤其是在并行性能。
查看这两个操作的源代码,除了一个以单一的DStream
作为输入而另一个是一个列表之外,没有区别。
def union[T: ClassTag](streams: Seq[DStream[T]]): DStream[T] = withScope {
new UnionDStream[T](streams.toArray)
}
def union(that: DStream[T]): DStream[T] = ssc.withScope {
new UnionDStream[T](Array(this, that))
}
因此,您所使用的一个取决于您的喜好,没有性能提升可拿。当你有一个要联合的流列表时,StreamingConext
中的方法简化了代码,因此,在这种情况下可能更好。
您的声明“DStream
提供了两种类型的联合”并不完全正确。
ref提到了不同的签名,更具体地说是提供联合操作的不同类。
StreamingContext.union(* dstreams)
创建由相同类型和相同幻灯片的时间长度的多个DStreams统一DSTREAM。
DStream.union(其他)
返回一个与此DSTREAM另一DSTREAM的统一数据新DSTREAM。 参数:other - 与此DStream具有相同间隔(即,slideDuration)的另一个DStream。
后来在Spark User List讨论:“工会函数返回与来自两个元素的DSTREAM这是相同的行为,当我们要求工会在RDDS”。
的StreamingContext源代码:4 DStream
def union(self, *dstreams):
...
first = dstreams[0]
jrest = [d._jdstream for d in dstreams[1:]]
return DStream(self._jssc.union(first._jdstream, jrest), self, first._jrdd_deserializer)
的源代码:
def union(self, other):
return self.transformWith(lambda a, b: a.union(b), other, True)
你可以看到第一个使用递归(如预期),而其他用途transformWith
,它在相同的类中定义并转换每个RDD。
的是要记住的是Level of Parallelism in Data Receiving,凡在案件中的数据接收成为系统的瓶颈,然后再考虑并行数据接收过程将是一个不错的主意。
因此,我们鼓励将union()
方法应用于多个DStreams
的过程,因此可以在保持代码清洁的同时提供方便的方法。恕我直言,这不会有性能上的差异。
不错的答案,我在发布答案之前准备好了,但我不得不去某个地方,所以我决定发布我的答案。你能看看吗? – gsamaras