将带有List的scala hashmap转换为带有java list的java hashmap
Posted
技术标签:
【中文标题】将带有List的scala hashmap转换为带有java list的java hashmap【英文标题】:convert scala hashmap with List to java hashmap with java list 【发布时间】:2016-10-09 10:25:03 【问题描述】:我是 scala 和 spark 的新手。我有以下案例类 A
case class A(uniqueId : String,
attributes: HashMap[String, List[String]])
现在我有一个 A 类型的数据帧。我需要在该 DF 的每一行上调用一个 java 函数。我需要将 Hashmap 转换为 Java HashMap 并将 List 转换为 java list.. 我该怎么做。
我正在尝试做以下事情
val rddCaseClass = RDD[A]
val a = rddCaseClass.toDF().map ( x=>
val rowData = x.getAs[java.util.HashMap[String,java.util.List[String]]]("attributes")
callJavaMethod(rowData)
但这给了我错误:
java.lang.ClassCastException: scala.collection.mutable.WrappedArray$ofRef 无法转换为 java.util.List
请帮忙。
【问题讨论】:
Convertion of Scala typed collection to Java with an unbounded wildcard, etc. Collection<?>的可能重复 【参考方案1】:您可以使用 Scala Wrapped array 转换为 Java List
scala.collection.JavaConversions
val wrappedArray: WrappedArray[String] = WrappedArray.make(Array("Java", "Scala"))
val javaList = JavaConversions.mutableSeqAsJavaList(wrappedArray)
JavaConversions.asJavaList
也可以使用,但已弃用:请改用mutableSeqAsJavaList
【讨论】:
【参考方案2】:我认为,您可以使用 Seq 而不是 List 作为参数,以便有效地使用 List。这样,它应该适用于大多数 Seq 实现,并且不需要像 WrappedArray 那样转换 seq。
val rddCaseClass = RDD[A]
val a = rddCaseClass.toDF().map ( x=>
val rowData = x.getAs[java.util.HashMap[String, Seq[String]]]("attributes")
callJavaMethod(rowData)
【讨论】:
以上是关于将带有List的scala hashmap转换为带有java list的java hashmap的主要内容,如果未能解决你的问题,请参考以下文章
如何将 scala.List 转换为 java.util.List?