I have a Spark Dataframe
Level Hierarchy Code -------------------------- Level1 Hier1 1 Level1 Hier2 2 Level1 Hier3 3 Level1 Hier4 4 Level1 Hier5 5 Level2 Hier1 1 Level2 Hier2 2 Level2 Hier3 3
I need to convert this to a Map variable like Map[String, Map[Int, String]]
i.e.
Map["Level1", Map[1->"Hier1", 2->"Hier2", 3->"Hier3", 4->"Hier4", 5->"Hier5"]]
Map["Level2", Map[1->"Hier1", 2->"Hier2", 3->"Hier3"]]
Please suggest a suitable approach to achieve this functionality.
My attempt. It works, but ugly
val level_code_df =master_df.select("Level","Hierarchy","Code").distinct()
val hierarchy_names = level_code_df.select("Level").distinct().collect()
val hierarchy_size = hierarchy_names.size
var hierarchyMap : scala.collection.mutable.Map[String, scala.collection.mutable.Map[Int,String]] = scala.collection.mutable.Map[String, scala.collection.mutable.Map[Int,String]]()
for(i <- 0 to hierarchy_size.toInt-1)
println("names:"+hierarchy_names(i)(0))
val name = hierarchy_names(i)(0).toString()
val code_level_map = level_code_df.rdd.map{row => {
if(name.equals(row.getAs[String]("Level"))){
Map(row.getAs[String]("Code").toInt -> row.getAs[String]("Hierarchy"))
} else
Map[Int, String]()
}}.reduce(_++_)
hierarchyMap = hierarchyMap + (name -> (collection.mutable.Map() ++ code_level_map))
}
}