spark scala与阻塞有效的成对比较

时间:2018-06-11 23:43:34

标签: scala apache-spark join blocking pairwise

鉴于包含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集上进行并集。

0 个答案:

没有答案