展平Spark中的行以及现有列

时间:2019-07-17 00:36:15

标签: scala apache-spark distributed-computing explode

我有一个如下的数据集。

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?

1 个答案:

答案 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|
+---+-----------+---+