繁体   English   中英

如何使用 scala 打印地图值列表

[英]How to print the list of map values using scala

我写了以下代码

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|斯瓦蒂|202 |

但我得到的只是,

+-----+-------+-----+

|empid|empName|depId|

+-----+-------+-----+ | 13|斯瓦蒂|202

请让我知道我在哪里做错了。

问题仅在于您的第一行,

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))

然后,您将listOfMapsmaps flattened ,这将产生一个key-value对列表。

scala> val flattenedListOfMaps = listOfMaps.flatten
// flattenedListOfMaps: List[(String, String)] = List((empid,12), (empName,Rohan), (depId,201), (empid,13), (empName,swathi), (depId,202))

现在,您正在使用toMap将其转换为Map ,这将继续覆盖键的值并生成具有唯一键的Map

scala> scala> val yourMap = flattenedListOfMaps.toMap
// yourMap: scala.collection.immutable.Map[String,String] = Map(empid -> 13, empName -> swathi, depId -> 202)

正如在之前的答案和评论中已经指出的那样,目前您的列表变量实际上是一个地图(至少令人困惑)。 您最初可能想要的输入是一个列表。 因此,您需要的是:

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 条记录。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM