Java 在ApacheBean数据流中使用PCollections生成图形表示

Java 在ApacheBean数据流中使用PCollections生成图形表示,java,google-cloud-dataflow,apache-beam,dataflow,Java,Google Cloud Dataflow,Apache Beam,Dataflow,我在下面的模式中有一个数据源——“人员ID”、“地址ID”。我已将数据加载到PCollection中 每个人可以有多个地址ID,每个地址可以分配给多个人。我试图找到的是所有相关的人或共享相同地址ID的人,而不仅仅是第一级到“n”级的人 假设P1对A1和A2有一条边,P2对A2和A3有一条边,P3对A3和A4有一条边。在这种情况下,如果我画一张图,我可以发现P1和P2相关,因为两者共享A2。P1也与P3相关,因为P1通过A2与P2相关,P2通过A3与P3相关 我的最终目标是找到这群有关系的人(通过

我在下面的模式中有一个数据源——“人员ID”、“地址ID”。我已将数据加载到PCollection中

每个人可以有多个地址ID,每个地址可以分配给多个人。我试图找到的是所有相关的人或共享相同地址ID的人,而不仅仅是第一级到“n”级的人

假设P1对A1和A2有一条边,P2对A2和A3有一条边,P3对A3和A4有一条边。在这种情况下,如果我画一张图,我可以发现P1和P2相关,因为两者共享A2。P1也与P3相关,因为P1通过A2与P2相关,P2通过A3与P3相关

我的最终目标是找到这群有关系的人(通过地址ID)。到目前为止,我所做的是尝试使用Join.innerJoin来形成临时表结构,并将其循环到我们需要的任何级别

PCollection<PeopleAddress> PA =  readEdges(); // 
PCollection<KV<String, PeopleAddress>> KAddressPA = transform(PA); // String is the address ID

PCollection<KV<String, KV<PeopleAddress, PeopleAddress>> data = Join.innerJoin(KAddressPA, KAddressPA);

//Above PCollection will give all first level edges, from this we will form a PeopleToPeople connection

PCollection<PeoplePeopleConnection> PP = getConnection(data); // From LHS and RHS we will read the ids and store. 

// With the new set of People People Connection we can  get new set of PeopleAddress edges..
Class PeoplePeopleConnection { String basePId; String cPId; }
Class PeopleAddress { String pId; String  aId; }
PCollection PA=readEdges();//
PCollection KAddressPA=变换(PA);//字符串是地址ID

PCollection好的,到目前为止,你会有两对住在同一个地址的人,对吗

PCollection PP=getConnection(数据);
这些对构成一个图,没有地址-只有人,并且距离为1
。我喜欢这样,因为它让我们能够专注于人,而放弃地址

那么,给定
(P1,P2)
(P2,P3)
-我们如何获得
(P1,P3)

我们可以这样做:

PCollection双向对=PP.apply(
FlatMapElements(pair->list.of(KV.of)(pair.basePId,pair.cPId),
(成对cPId,成对basePId));
然后,我们可以加入他们,就像你以前一样:

PCollection{
List newPairs=cartesianProduct(neights.getValue());
if(newPairs.size()==0){
返回list.of(KV.of(neights.getKey(),neights.getValue().get(0)),
of(neights.getValue().get(0),neights.getKey());
}否则{
返回新对;
}
});
为什么要检查
newPairs
是否为空?因为当
newPairs
元素为空时,就出现了未链接到其他元素的成对情况(例如,前面的
(P1,[P2])

因此,最后,您应该能够执行以下操作:

//我们得到的距离=1个元素:
p收集双向对=PP.apply(
FlatMapElements(pair->list.of(KV.of)(pair.basePId,pair.cPId),
(成对cPId,成对basePId));
对于(int i=1;i{
List newPairs=cartesianProduct(neights.getValue());
if(newPairs.size()==0){
返回list.of(KV.of(neights.getKey(),neights.getValue().get(0)),
of(neights.getValue().get(0),neights.getKey());
}否则{
返回新对;
}
});
}

这应该有助于生成距离为
distance的邻居。听起来你想把你的人分成相连的组件,对吗?给定节点A和B,如果它们之间存在任何路径,应该将它们分组在一起。对吗?你的输出结果如何?类似于人ID,人ID_2,Level?Pablo是的,你想要什么说的是对的。我想知道我们是否可以通过地址Id找到两个人之间的路径。我需要他们分组together@rmesteves事实上我不关心等级,PeId1,PeId2-是我所期望的。最后我可以做一个分组,找到所有的PeId关系。嗯,你知道两个节点之间的最大距离是多少吗?如果有如果两个节点之间没有最大距离,则此算法需要在单个输入上迭代多次。| |后续:您的输出是什么样的?连接对的列表?例如
(P1,A1)
(P2,A1)
(P3,A1)
(P1,P2)
(P2,P3)
(P3,P1)