Google cloud dataflow 使用SideInput加入集合

Google cloud dataflow 使用SideInput加入集合,google-cloud-dataflow,apache-beam,Google Cloud Dataflow,Apache Beam,正在尝试使用SideInput转换联接两个Pcollection。在映射值时,在ParDo函数中,我们可以从sideinput集合中获得多个映射记录作为一个集合。在这种情况下,如何处理集合以及如何将这些值集合返回给PCollection 如果有人能帮助解决这个案子就好了。下面是我尝试过的代码片段 PCollection pc1=。。。; PCollection pc1Rows=pc1.apply( ParDo.of(new fnConvertTableRowToRow()).setRowSche

正在尝试使用SideInput转换联接两个Pcollection。在映射值时,在ParDo函数中,我们可以从sideinput集合中获得多个映射记录作为一个集合。在这种情况下,如何处理集合以及如何将这些值集合返回给PCollection

如果有人能帮助解决这个案子就好了。下面是我尝试过的代码片段

PCollection pc1=。。。;
PCollection pc1Rows=pc1.apply(
ParDo.of(new fnConvertTableRowToRow()).setRowSchema(schemap1);
PCollection键控\u pc1Rows=pc1Rows.apply(
WithKeys.of(新的SerializableFunction(){
公共整数应用(第s行){
返回Integer.parseInt(s.getValue(“LOCATION_ID”).toString();
}
}));
PCollection pc2=。。。;
PCollection pc2Rows=pc2.apply(
ParDo.of(new fnConvertTableRowToRow()).setRowSchema(SchemaP2);
PCollection关键字组=pc2Rows.apply(
新的fnGroupKeyWords());
PCollectionView侧输入视图=
关键字组。应用(“侧输入”,
View.asMap());
PCollection finalResultCollection=keyed_pc1Rows.apply(“过程”,
(新DoFn()的副部长{
@过程元素
公共void processElement(ProcessContext c){
Integer key=Integer.parseInt(c.element().getKey().toString());
行leftRow=c.element().getValue();
Map key2Rows=c.sideInput(sideInputView);
Iterable rightRowsIterable=key2Rows.get(键);
for(迭代器i=rightRowsIterable.Iterator();i.hasNext();){
Row suit=(Row)i.next();
Row targetRow=具有模式的行(模式输出)
.addValues(leftRow.getValues())
.addValues(suit.getValues())
.build();
c、 输出(targetRow);
}
}
}).带有SideInputs(sideInputView));
公共静态类fnGroupKeyWords扩展
转移{
@凌驾
公共PCollection扩展(
p收集行){
PCollection kvs=行。应用(
(新的TransferKeyValueFn())的附件;
PCollection组=kvs.apply(
GroupByKey.create());
返回组;
}
}

公共静态类TransferKeyValueFn扩展
DoFn{
@过程元素
public void processElement(ProcessContext c)引发ParseException异常{
Row tRow=c.元素();
c、 输出(
千伏(
Integer.parseInt(tRow.getValue(“DW\u LOCATION\u ID”).toString(),
特罗);
}
}

如果您希望使用公共密钥将两个PCollection连接在一起。这可能更有意义。请考虑这种方法,而不是侧输入< /P>
这也有一个很好的解释。

我认为如果你有一个非常小的集合,可以放入内存,那么使用SideInput建议会很好。您可以使用它作为一个侧面输入。然后在ParDo中处理较大的PCollection(在GBK之后,为该键的所有元素提供一个iterable),从侧面输入查找您感兴趣的键。下面是一个使用多重贴图pcollection的示例


但是,如果您的集合非常大,那么使用Flatte将两个PCollection组合在一起将是更好的方法。然后使用GroupByKey,这将为同一个键下的元素提供一个iterable for。这仍将按顺序进行处理。尽管如此,我相信您将在性能方面遇到问题,除非您消除热键

谢谢你的反馈。我们已经尝试过CoGroupsByKey,在处理超过10000个元素时,该方法面临性能问题。根据stackoverflow建议,使用SideInput进行连接。现在,当集合对主数据有多个映射记录并且想要知道如何处理它时,我们面临着SideInput的挑战。