鉴于包含cookieID,IP地址,地理信息的点击流数据,我正在尝试计算Jaccard相似性(或任何其他相似性度量)b / w所有可能的cookie对基于基于cookieID聚合的IP地址集,并预测相似性大于阈值的cookie对作为来自相同个体的cookie。更正式地说,如果是sim((cookieID1,[IP_1,IP_2,...,IP_n1]),(cookieID2,[IP_1,IP_2,...,IP_n2]))>则cookieID1和cookieID2来自同一用户。 0.9,不是其他。
然而,数十亿的cookieID使得这项任务非常具有挑战性。一种可能的解决方案是将它们分组为不相交的块,并考虑将类似的实体聚类成块和 成对比较仅在共存的cookie之间执行, 以一些错过的比赛为代价。现在,我根据邮政编码将它们分成块,假设相同的cookie出现在同一位置。
然而,由于我们的数据集的规模,它仍然需要超过一天,需要更高效。如果您能给我一些评论或分享您以前的经历,我们将非常感激。以下是我在Spark scala中使用的代码。
val data = input.select("timestamp", "userID", "IP", "zipCode")
val aggData = data
.groupBy("userID", "zipCode")
.agg(max("timestamp").as("maxT"), min("timestamp").as("minT"), collect_set("IP").as("IPs"))
.withColumn("lifetime", 'maxT - 'minT)
val aggData2 = aggData
.groupBy("userID")
.agg(max(struct("lifetime", "zipCode")).alias("max"), union("IPs").as("IPs"))
.withColumn($"max.zipCode", "blockingKey")
val joinData = aggData2.as("a")
.join(aggData2.as("b"), $"a.blockingKey" === $"b.blockingKey" && $"a.userID" > $"b.userID")
.repartition($"zipCode")
.withColumn("sim", JaccardUtils.jaccardUdf($"a.IPs", $"b.IPs"))
.where($"sim" >= 0.75)
.select($"a.aamuuidIndex".as("idA"), $"b.aamuuidIndex".as("idB"))
请注意,union()是用户定义的函数,它在IP集上进行并集。