我写了以下代码
val list = List(
Map("empid" -> "12", "empName" -> "Rohan", "depId" -> "201"),
Map("empid" -> "13", "empName" -> "swathi", "depId" -> "202")
).flatten.toMap
val mapRDD= sc.parallelize(Seq(list))
val columns=mapRDD.take(1).flatMap(a=>a.keys)
val columnval=mapRDD.take(2).flatMap(a=>a.keys)
val resultantDF=mapRDD.map{value=>
val list=value.values.toList
(list(0),list(1),list(2))
}.toDF(columns:_*)
resultantDF.show()
我期待以下输出,
+ ----- + ------- + ----- +
| EMPID | empName | DEPID |
+ ----- + ------- + ----- +
| 12 |罗汉| 201 |
| 13 | SWATHI | 202 |
但我只是得到了,
+ ----- + ------- + ----- +
| EMPID | empName | DEPID |
+ ----- + ------- + ----- + | 13 | SWATHI | 202
请让我知道我在哪里犯错误。
答案 0 :(得分:2)
问题在于你的第一行,
scala> val list = List(
| Map("empid" -> "12", "empName" -> "Rohan", "depId" -> "201"),
| Map("empid" -> "13", "empName" -> "swathi", "depId" -> "202")
| ).flatten.toMap
// list: scala.collection.immutable.Map[String,String] = Map(empid -> 13, empName -> swathi, depId -> 202)
您的list
实际上最终成为Map
。并且Map
每个键只能有1个值。
让我们一步一步地做第一行,
所以,首先你创建了一个list of maps
,
scala> val listOfMaps = List(
| Map("empid" -> "12", "empName" -> "Rohan", "depId" -> "201"),
| Map("empid" -> "13", "empName" -> "swathi", "depId" -> "202")
| )
// list: List[scala.collection.immutable.Map[String,String]] = List(Map(empid -> 12, empName -> Rohan, depId -> 201), Map(empid -> 13, empName -> swathi, depId -> 202))
然后,flattened
maps
listOfMaps
内的key-value
会产生scala> val flattenedListOfMaps = listOfMaps.flatten
// flattenedListOfMaps: List[(String, String)] = List((empid,12), (empName,Rohan), (depId,201), (empid,13), (empName,swathi), (depId,202))
对的列表。
Map
现在,您要使用toMap
将其转换为Map
,这将继续覆盖密钥的值,并生成具有唯一键的scala> scala> val yourMap = flattenedListOfMaps.toMap
// yourMap: scala.collection.immutable.Map[String,String] = Map(empid -> 13, empName -> swathi, depId -> 202)
,
main class App.java
答案 1 :(得分:0)
正如前面的答案和评论中已经指出的那样,目前你的列表变量实际上是一张地图(至少令人困惑)。 你最初想要输入的是一个列表。 因此,您需要的是:
1。
摆脱.flatten.toMap
:
val list = List(
Map("empid" -> "12", "empName" -> "Rohan", "depId" -> "201"),
Map("empid" -> "13", "empName" -> "swathi", "depId" -> "202")
)
2。
另外,在调用sc.parallelize
时,您不需要从原始输入创建单独的Seq(事实上,否则您将遇到编译错误)。
所以你还需要改变它:
val mapRDD = sc.parallelize(list)
仅进行这两项更改后,您将收到预期的结果,即控制台输出中显示的2条记录。