У меня есть набор данных, как показано ниже.
id1 k1, k2, k3, k4
id2 k1, k2
id3 k2, k3
id4 k4
Я хочу подсчитать количество строк, в которых присутствует каждый из моих «k», а также идентификаторы, для которых он присутствует.
выход :
k1 2 id1, id2
k2 3 id1, id2, id3
k3 2 id1, id3
k4 2 id1, id4
Я использовал взорвать, а затем сгруппировать по клавишам, и я получаю следующий вывод.
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
Есть ли способ, которым я могу добавить идентификаторы?
Вы можете использовать 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|
+---+-----------+---+