Spark 2.2+Scala 2.11:统计节点同类型出边数量问题
解决Spark统计节点同类型出边数量(含0值节点)的问题
嘿,我来帮你搞定这个问题!你现在的groupBy思路方向是对的,但确实漏掉了那些没有符合条件出边的节点——毕竟默认聚合只会返回有数据的分组,咱们得把所有节点都拉进来才行,一步步来:
第一步:计算有同类型出边的节点统计
首先,先按照你的逻辑过滤出符合条件的边(排除自环、且首尾节点类型相同),然后统计每个节点的出边数:
import org.apache.spark.sql.functions.{count, lit, coalesce} // 先统计有符合条件出边的节点数量 val sameTypeOutEdges = graphDF .filter($"from" =!= $"to") // 排除自环边,和你原逻辑一致 .filter($"type_from" === $"type_to") .groupBy($"from" as "nodeId") .agg(count($"from") as "numLinks")
第二步:关联所有节点并填充0值
因为types表包含了所有需要统计的节点,我们用左外连接把它和上面的统计结果关联起来,这样就能保留所有节点;然后用coalesce把没有统计到的节点的numLinks从null转为0:
// 关联types表补全所有节点,填充0值 val finalResult = types .join(sameTypeOutEdges, Seq("nodeId"), "left_outer") .withColumn("numLinks", coalesce($"numLinks", lit(0))) .select("nodeId", "numLinks", "type") .orderBy($"nodeId") // 可选,和你的期望结果排序一致
验证结果
运行finalResult.show()就能得到你想要的输出:
+------+---------+-----+ |nodeId|numLinks |type | +------+---------+-----+ | 0| 0| 0| | 1| 1| 0| | 2| 0| 2| | 3| 0| 4| | 4| 2| 4| | 5| 0| 4| +------+---------+-----+
这里的关键是用左外连接保留所有节点,再用coalesce处理空值——毕竟那些没有出边、或者出边都不是同类型的节点,在第一步的聚合结果里是不存在的,必须通过关联全量节点表来补全。
内容的提问来源于stack exchange,提问作者Markus
相关产品推荐
相关产品推荐

