如何从谷歌数据流管道中的多个输入 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 作为输出。

那么,有没有什么方法可以使用PCollectionTupleParDo 而不是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&lt;A&gt; 只有一个元素,因为它是之前的 CombineFn 的结果。所以,是的,PCollection&lt;A&gt; 在这种情况下很小。 @danieml,所以还有一些疑问:在这种情况下,对于分布在服务器上的每个 PCollection&lt;C&gt;,我是否有相同的保修,并且在这种情况下整个 PCollection&lt;A&gt; 将可用当 DoFn 函数并行执行时,A 类型的List?是否为每个分布式服务器复制了PCollection&lt;A&gt;

以上是关于如何从谷歌数据流管道中的多个输入 PCollection 生成一个输出 PCollection?的主要内容,如果未能解决你的问题,请参考以下文章

如何从谷歌地图中删除特定的多个标记而不是单个或所有标记

从谷歌地图中获取拖拽的路线数据

如何通过输入城市/城镇名称从谷歌地图获取餐厅列表?

我应该如何使用 html 代码从谷歌表中获取数据

如何从谷歌地图 API 获取楼层号或套房与纬度

如何从谷歌地图v2 android中的标记获取屏幕坐标