我有一个包含tx_ids和node_ids对的数据集,其中每个tx_id与一个或多个node_id相关联。 连接到同一tx_id的node_id属于同一用户。 如果相同的node_id连接到不同的tx_ids,则与这些tx_ids相关联的所有节点也属于同一用户。
查看以下数据集的小样本:
tx_id node_id user_id
1 a 1
1 d 1
2 d 1
2 g 1
3 g 1
3 e 1
4 c 2
4 f 2
例如,节点{a,d}属于与它们出现时具有相同tx_id的同一用户。此外,{d}连接到tx_ids = {1,2},然后{a,d,g}都属于同一个用户。但是{g}出现在tx_ids = {2,3}中,这意味着tx_ids = {1,2,3}中的所有节点都属于同一个用户(如上所示)。
让我们这样说: tx_id = transaction_id,node_id =银行帐户。
用户可能拥有多个银行帐户,银行帐户只属于一个用户。现在,用户可以从不同的帐户发起单个交易(在我的情况下), 因此,在tx_id = 1的上述示例中,(User_1)使用了两个帐户{a,d},这意味着使用帐户{a,d}的任何交易都属于User_1,因此tx_id = 2属于User_1,因为它包含帐号{d}出现在tx_id = 1中。我想创建一个新表,其中包含tx_id,node_id,user_id(新的整数值,不连续且不唯一)
问题在于,在我的数据集中,user_ids未分配给节点,而且我有一个包含400M记录的庞大数据集。鉴于我的数据集存储在PostgreSQL数据库中,我正在寻找一种有效的方法来解决这个问题。如果可以通过SQL查询解决这个问题,那就太好了,否则,任何编程语言中的任何建议都会受到赞赏。
提前致谢。
答案 0 :(得分:1)
使用python词典作为查找表来存储node_ids及其相应的user_id。检索由tx_id排序的tx_id,node_id列表,如果node_id出现了两个tx_id,稍后出现的tx将发现node_id已经存储在python字典中并从dict获取user_id。
这是union-find分区问题,问题是如果它们有一个公共node_id,如何联合集合(在你的情况下为tx)。