Scala 如何将此数据集转换为以下数据集

Scala 如何将此数据集转换为以下数据集,scala,apache-spark,apache-spark-sql,apache-spark-dataset,apache-spark-2.0,Scala,Apache Spark,Apache Spark Sql,Apache Spark Dataset,Apache Spark 2.0,输入 期望输出 +------+------+------+------+ |emp_name|emp_area| dept|zip| +------+------+------+------+ |ram|USA|"Sales"|805912| |sham|USA|"Sales"|805912| |ram|Canada|"Marketing"|805912| |ram|USA|"Sales"|

输入

期望输出

+------+------+------+------+
|emp_name|emp_area| dept|zip| 
+------+------+------+------+
|ram|USA|"Sales"|805912|     
|sham|USA|"Sales"|805912|   
|ram|Canada|"Marketing"|805912|   
|ram|USA|"Sales"|805912|
|sham|USA|"Marketing"|805912|      
+------+------+------+------
我开始动态地为它们中的每一个生成计数,但无法将它们存储在数据集中

feature   |Top1 name |Top 1 value1|Top2 name|top 2 value|

emp_name    ram |3|sham |2
emp_area    Usa |4|canada |1    
dept       sales|3|Marketing|3
zip         805912|5|NA|NA      
val features=ds.columns.toList

对于(e这里有一个稍微详细的方法。您可以
将每列映射到一个数据帧,其中一行对应于所需输出中的行。如有必要,添加NA列。将列名转换为所需的列名,最后执行
unionAll
以组合数据帧(每行一行)

import org.apache.spark.sql.expressions.Window
val top=2
val结果=ds.columns.map(
c=>ds.groupBy(c.count())
.withColumn(“rn”,row_number()。在(Window.orderBy(desc(“count”))上方)

.过滤器“rn首先,我们将循环每个列,并应用pivot和group by,然后选择列。在此之后,您可以解释映射中的代码吗?第二个映射添加NA列,以确保所有数据帧具有相同的列数。第三个映射更改数据帧的列名,以匹配您所需的输出。
val features=ds.columns.toList
for (e <- features) {
  val ds1=ds.groupBy(e).count().sort(desc("count")).limit(5).withColumnRenamed("count", e+"_count")
}
import org.apache.spark.sql.expressions.Window

val top = 2

val result = ds.columns.map(
    c => ds.groupBy(c).count()
           .withColumn("rn", row_number().over(Window.orderBy(desc("count"))))
           .filter(s"rn <= $top")
           .groupBy().pivot("rn")
           .agg(first(col(c)), first(col("count")))
           .select(lit(c), col("*"))
).map(df => 
    if (df.columns.size != 1 + top*2)
        df.select(List(col("*")) ::: (1 to (top*2+1 - df.columns.size)).toList.map(x => lit("NA")): _*)
    else df
).map(df =>
    df.toDF(List("feature") ::: (1 to top).toList.flatMap(x => Seq(s"top$x name", s"top$x value")): _*)
).reduce(_ unionAll _)

result.show
+--------+---------+----------+---------+----------+
| feature|top1 name|top1 value|top2 name|top2 value|
+--------+---------+----------+---------+----------+
|emp_name|      ram|         3|     sham|         2|
|emp_area|      USA|         4|   Canada|         1|
|    dept|    Sales|         3|Marketing|         2|
|     zip|   805912|         5|       NA|        NA|
+--------+---------+----------+---------+----------+