将带有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的主要内容,如果未能解决你的问题,请参考以下文章

帮助将子查询转换为带连接的查询

使用Java将String中的大写文本转换为带重音的小写

将 MySQL 中的值列表转换为带方括号的数组

如何将 scala.List 转换为 java.util.List?

Scala - 将列表转换为单个列表:List[List[A]] 到 List[A]

AFNetworking 在格式化 JSON 时将我的双打转换为带引号的字符串