我有一个如下的数据集。
id1 k1, k2, k3, k4
id2 k1, k2
id3 k2, k3
id4 k4
我希望计算出我的每个“ k”所代表的行数以及ID所代表的行数。
输出:
k1 2 id1, id2
k2 3 id1, id2, id3
k3 2 id1, id3
k4 2 id1, id4
我使用了explode,然后按on键进行分组,得到以下输出。
val newlines = sparkSession.read.textFile(s3Path)
.map(ke => {
val split = ke.split("\t")
(split(0), split(1).toString.split(", "))
})
val myDF = newlines.withColumn("Key", explode($"_3")).groupBy(("Key"))
.agg(count("Key"))
k1 2
k2 3
k3 2
k4 2
有没有一种方法可以添加ID?
答案 0 :(得分:1)
您可以使用spark inbuilt
个功能split,explode,agg
!
示例:
scala> import org.apache.spark.sql.functions._
scala> val df=Seq(("id1","k1,k2,k3,k4"),
("id2","k1,k2"),
("id3","k2,k3"),
("id4","k4"))
.toDF("a","b")
scala> df.selectExpr("a","explode(split(b,',')) as ex")
.groupBy('ex)
.agg(concat_ws(",",collect_list('a)).alias("b"),
count("*").alias("cnt"))
.orderBy('ex)
.show()
结果:
+---+-----------+---+
| ex| b|cnt|
+---+-----------+---+
| k1| id1,id2| 2|
| k2|id1,id2,id3| 3|
| k3| id1,id3| 2|
| k4| id1,id4| 2|
+---+-----------+---+