How to group by common element in array?
apache-spark, apache-spark-sql
Solution
Include `graphframes` (the latest supported Spark version is 2.1, but it should support 2.2 as well, if you use newer you'll have to build your own with 2.3 patch) replacing `XXX` with Spark version and `YYY` with Scala version:
spark.jars.packages graphframes:graphframes:0.5.0-sparkXXX-s_YYY
Add explode keys:
import org.apache.spark.sql.functions._
val df = Seq(
(Seq("k1", "k2"), "v1"), (Seq("k2"), "v2"),
(Seq("k3", "k2"), "v3"), (Seq("k4"), "v4")
).toDF("key", "value")
val edges = df.select(
explode($"key") as "src", $"value" as "dst")
Convert to `graphframe`:
import org.graphframes._
val gf = GraphFrame.fromEdges(edges)
Set checkpoint directory (if not set):
import org.apache.spark.sql.SparkSession
val path: String = ???
val spark: SparkSession = ???
spark.sparkContext.setCheckpointDir(path)
Find connected components:
val components = GraphFrame.fromEdges(edges).connectedComponents.setAlgorithm("graphx").run
Join result with input data:
val result = components.where($"id".startsWith("v")).toDF("value", "group").join(df, Seq("value"))
Check result:
result.show
// +-----+------------+--------+
// |value| group| key|
// +-----+------------+--------+
// | v3|489626271744|[k3, k2]|
// | v2|489626271744| [k2]|
// | v4|532575944704| [k4]|
// | v1|489626271744|[k1, k2]|
// +-----+------------+--------+
Problem
I am trying to find the solution in spark to group data with a common element in an array. ``` key value [k1,k2] v1 [k2] v2 [k3,k2] v3 [k4] v4 ``` If any element matches in key, we have to assign same groupid to that.(Groupby common element) Result: ``` key value GroupID [k1,k2] v1 G1 [k2] v2 G1 [k3,k2] v3 G1 [k4] v4 G2 ``` Some suggestions are already given with Spark Graphx, but at this moment learning curve will be more to implement this for a single feature.