我想访问一个包含类似于Spark combine columns as nested array
的嵌套数组的列columnsMap
res95: scala.collection.immutable.Map[String,scala.collection.immutable.Map[String,Array[Double]]] = Map(col1 -> Map(A -> WrappedArray(0.5, 0.6666666666666666), d -> WrappedArray(0.25, 0.3333333333333333), c -> WrappedArray(0.25, 1.0)), col2 -> Map(a -> WrappedArray(0.0, 0.0), g -> WrappedArray(0.0, 0.0), B -> WrappedArray(0.5, 0.6666666666666666), c -> WrappedArray(0.25, 1.0), d -> WrappedArray(0.25, 1.0)), col3TooMany -> Map(C -> WrappedArray(0.75, 0.6), jkl -> WrappedArray(0.0, 0.0), t -> WrappedArray(0.25, 1.0)))
scala> columnsMap.get("col1").get.get("A")
res96: Option[Array[Double]] = Some(WrappedArray(0.5, 0.6666666666666666))
如何访问普通Scala中的WrappedArray
?
scala> columnsMap.get("col1").get.get("A").get
java.lang.ClassCastException: scala.collection.mutable.WrappedArray$ofRef cannot be cast to [D
... 42 elided
答案 0 :(得分:1)
您可以使用getOrElse来避免直接使用选项:
val columnsMap = Map("col1" -> Map("A" -> Seq(1.0, 2.0)))
val nestedArray = columnsMap.getOrElse("col1", Map()).getOrElse("A", Seq(0.0))
然后,要获得第一个元素,您可以执行以下操作:
nestedArray.head
或者,如果收集的行没有正确地将数组键入Seq,您可能需要这样做:
nestedArray.asInstanceOf[Seq[Double]].head
但理想的应该是用正确的类型收集。例如,如果您在某个时候使用row.getAs
,则应该是:
row.getAs[Map[String, Map[String, Seq[Double]]]](colName)