在下面的代码中, entities
是一个 Map[String, Seq[String]]
我从其他代码段收到的对象。目标是将实体对象Map到一个两列sparkDataframe中;但是,在我到达那里之前,我发现了一些非常不寻常的结果。
val data: Map[String, Seq[String]] = Map("idtag" -> Seq("things", "associated", "with", "id"))
println(data)
println(data.toSeq)
data.toSeq.foreach{println}
data.toSeq.map{case(id: String, names: Seq[String]) => names}.foreach{println}
val eSeq: Seq[(String, Seq[String])] = entities.toSeq
println(eSeq.head)
println(eSeq.head.getClass)
println(eSeq.head._1.getClass)
println(eSeq.head._2.getClass)
eSeq.map{case(id: String, names: Seq[String]) => names}.foreach{println}
控制台上的上述输出为:
Map(idtag -> List(things, associated, with, id))
ArrayBuffer((idtag,List(things, associated, with, id)))
(idtag,List(things, associated, with, id))
List(things, associated, with, id)
(0CY4NZ-E,["MEC", "Marriott-MEC", "Media IQ - Kimberly Clark c/o Mindshare", "Mindshare", "WPP", "WPP Plc", "Wavemaker Global", "Wavemaker Global Ltd"])
class scala.Tuple2
class java.lang.String
class java.lang.String
Exception in thread "main" java.lang.ClassCastException: java.lang.String cannot be cast to scala.collection.Seq
at package.EntityList$$anonfun$toStorage$4.apply(EntityList.scala:31)
这个 data
我硬编码的对象按预期运行。这个 .toSeq
实体Map上的函数生成 Seq
(作为arraybuffer实现)元组;这些元组可以通过Map来处理。
但是使用 entities
对象,当我使用 .head
它是一个 Tuple2[String, String]
. 怎么可能呢?元组的第二个元素如何变成字符串并导致异常?
如果最后一行被修改以反映 Tuple2[String, String]
:
eSeq.map{case(id: String, names: String) => names}.foreach{println}
然后我们得到一个编译错误:
/path/to/repo/src/main/scala/package/EntityList.scala:31: error: pattern type is incompatible with expected type;
found : String
required: Seq[String]
eSeq.map{case(id: String, names: String) => names}.foreach{println}
我不能用一只手复制这种奇怪的行为 Map[String, Seq[String]]
我自己创造的,正如你在这段代码中看到的。有人能解释这种行为以及为什么会发生吗?
1条答案
按热度按时间hwamh0ep1#
问题似乎是
entities.toSeq
在返回的数据类型上撒谎,所以我会查看“其他一些代码”并检查它是否做了正确的事情。具体来说,它声称要返回
Seq[(String, Seq[String])]
编译人员相信这一点。但是getClass
显示元组中的第二个对象实际上是java.lang.String
不是Seq[String]
.如果这是正确的,那么
match
语句将使用unapply
提取值,然后在尝试转换时出错names
到指定的类型。我注意到这个字符串似乎是一个包含在
[
]
,所以似乎有可能entities
无法将其解析为Seq
但声称它已经成功了。