Apache spark 如何在spark数据集中检测周期
我有一个Spark数据集,其中包含以下数据列:BuyerID、SellerID。我需要找出这些事务中是否存在周期。例如A卖出B和B卖出A。在Spark中实现这一点的最佳方法是什么。为了简化问题,数据集中还有一些我没有提到的其他列 我需要找出这些事务中是否存在周期。例如A卖了B,B卖了A 对于这种非正式的循环定义(与正式的图论定义相反),在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
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解决方案。