我有两个PCollection<KV<String, TableRow>>
,一个有〜700万行,另一个有〜100万行。
我想做的是在这两个PCollection之间应用左外部联接,并在成功联接的情况下,将右TableRow的所有数据放到左TableRow并返回结果。
我曾尝试在针对Java的Apache Beam SDK 2.10.0中使用CoGroupByKey,但在这里我得到了太多的热键,因此在警告CoGrupByKey之后,我的获取结果越来越慢,因为警告“每个键需要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);
}
}
}
}));
在数据流中执行这些类型的联接的方法是什么?
我进行了一些研究,发现了一些可以帮助您的信息。
由PCollection(可序列化对象)之间的数据流传输的发送数据可能不存在于单个计算机中。此外,类似GroupByKey / CoGroupByKey的需求需要将所有数据收集在一个位置,然后再填充结果,我不知道您是否具有其他结构。
此外,您可以重新分配密钥,减少工作人员并增加内存,或者尝试使用Combine.perKey。