Apache spark 如何在spark数据集中检测周期

Apache spark 如何在spark数据集中检测周期,apache-spark,apache-spark-dataset,Apache Spark,Apache Spark Dataset,我有一个Spark数据集,其中包含以下数据列:BuyerID、SellerID。我需要找出这些事务中是否存在周期。例如A卖出B和B卖出A。在Spark中实现这一点的最佳方法是什么。为了简化问题,数据集中还有一些我没有提到的其他列 我需要找出这些事务中是否存在周期。例如A卖了B,B卖了A 对于这种非正式的循环定义(与正式的图论定义相反),在Spark中实现它几乎是微不足道的。对标签进行排序: import org.apache.spark.sql.functions._ val dfFromTo

我有一个Spark数据集,其中包含以下数据列:BuyerID、SellerID。我需要找出这些事务中是否存在周期。例如A卖出B和B卖出A。在Spark中实现这一点的最佳方法是什么。为了简化问题,数据集中还有一些我没有提到的其他列

我需要找出这些事务中是否存在周期。例如A卖了B,B卖了A

对于这种非正式的循环定义(与正式的图论定义相反),在Spark中实现它几乎是微不足道的。对标签进行排序:

import org.apache.spark.sql.functions._

val dfFromTo = df
  .withColumn("from", least($"BuyerID", $"SellerID"))
  .withColumn("to", greatest($"BuyerID", $"SellerID"))
聚合和过滤:

val cycles = dfFromTo.groupBy("from", "to").count.where($"count" > 1)
反连接以从数据中删除周期:

dfFromTo.join(cycles, Seq("from", "to"), "leftanti")
从技术上讲,正式的循环检测(如A->B->C->A)可以使用图形处理原语(如消息传递),但通常不能很好地扩展,除非对输入进行非常严格的限制


在这种情况下,最好使用优化的核心工具(如果可能的话)或专用图形处理工具(与Spark中可用的废弃[GraphX]或SQL[graphframes]工具之上的piggy backing相反)。

请尝试自连接

val data = Seq((1,2),(3,4),(5,6),(2,1),(2,3)).toDF("Buyer","Seller")
 data.as("df1").join(data.as("df2"), $"df1.Buyer" === $"df2.Seller" and $"df1.Seller" === $"df2.Buyer")
输出

+-----+------+-----+------+
|Buyer|Seller|Buyer|Seller|
+-----+------+-----+------+
|    1|     2|    2|     1|
|    2|     1|    1|     2|
+-----+------+-----+------+

谢谢你的回复。你能给我一个Java版本吗?谢谢你的回复。在这种情况下,id列不是数字。它是字母数字的。也希望有Java解决方案。