如何从谷歌数据流管道中的多个输入 PCollection 生成一个输出 PCollection?
Posted
技术标签:
【中文标题】如何从谷歌数据流管道中的多个输入 PCollection 生成一个输出 PCollection?【英文标题】:How to produce one output PCollection from multiple inputs PCollections in google data flow pipelines? 【发布时间】:2016-10-15 23:06:30 【问题描述】:我正在尝试使用变压器从 2 个输入中生成 PCollection<C>
(带有 C 类型的元素):一个 PCollection<A>
(带有 A 类型的元素),第二个是 PCollection<C>
。
基本上,转换器会考虑存储在PCollection<A>
中的元素,并对PCollection<C>
中的元素进行一些计算,最终它会生成一个带有新元素的新PCollection 作为输出。
那么,有没有什么方法可以使用PCollectionTuple
或ParDo
而不是PCollectionTuple
来实现这个场景,只产生一个输出PCollection
,或者使用Google Dataflow SDK 的任何其他建议?
【问题讨论】:
【参考方案1】:有多种方法可以在 Dataflow 中加入 PCollections。对于您的情况,PCollection<C>
中的每个元素都需要访问PCollection<A>
中可能存在的多个元素,您可以使用侧面输入。有关详细信息,请参阅View 转换。
例如,假设 pCollectionA 很小:
PCollectionView<List<A>> view = View.asList(pCollectionA);
PCollection<C> output = pCollectionC.apply(ParDo.withSideInputs(view).of(
new DoFn<C,C>()
public void processElement(ProcessContext c)
c.output(...combine c.element() and c.sideInput(view)...);
);
如果您只需要访问每个元素的 pCollectionA 的一部分,则可以改用 View.asMultimap,这将允许在 pCollectionA 中查找点
【讨论】:
非常感谢@danielm。在我的例子中,PCollection<A>
只有一个元素,因为它是之前的 CombineFn 的结果。所以,是的,PCollection<A>
在这种情况下很小。
@danieml,所以还有一些疑问:在这种情况下,对于分布在服务器上的每个 PCollection<C>
,我是否有相同的保修,并且在这种情况下整个 PCollection<A>
将可用当 DoFn 函数并行执行时,A 类型的List
?是否为每个分布式服务器复制了PCollection<A>
?以上是关于如何从谷歌数据流管道中的多个输入 PCollection 生成一个输出 PCollection?的主要内容,如果未能解决你的问题,请参考以下文章