我有两个 PCollection<KV<String, TableRow>>
一个〜700万行,另一行约为100万行。
我想做的是在这两个pcollections之间施加左外接线,如果成功加入,请将右Tablerow的所有数据都放在左Tablerow中并返回结果。
我尝试使用Apache Beam SDK 2.10.0中的cogroupbykey进行Java,在这里我得到了很多热键,因此CogrupByKey之后的取得结果越来越慢,因为"每钥匙更多10000个元素,需要重申的10000个元素"。我还尝试了洗牌模式服务,但没有帮助。
PCollection<TableRow> finalResultCollection =
coGbkResultCollection.apply(ParDo.of(
new DoFn<KV<K, CoGbkResult>, TableROw>() {
@Override
public void processElement(ProcessContext c) {
KV<K, CoGbkResult> e = c.element();
// Get all collection 1 values
Iterable<TableRow> pt1Vals = e.getValue().getAll(t1);
Iterable<TableRow> pt2Vals = e.getValue().getAll(t2);
for (TableRow tr : pt1Vals)
{
TableRow out = tr.clone();
if(pt2Vals.iterator().hasNext())
{
for (TableRow tr1 : pt2Vals)
{
out.putAll(tr1);
c.output(out);
}
}
else
{
c.output(out);
}
}
}
}));
在数据流中执行此类连接的方法是什么?
我做了一些研究,我找到了一些可以帮助您的信息。
通过数据流传输的数据在PCollections之间传输(可序列化对象)可能不存在一台计算机中。此外,像GroupByKey/CogroupByKey的转换需要在被填充的人群之前收集的所有数据,我不知道您是否在不同的结构中都有它。
除此您也可以尝试此解决方法,或者您可以阅读本文并拥有更多可以帮助您的信息。