Spark访问嵌套列

时间:2016-12-20 13:43:43

标签: scala apache-spark nested

我想访问一个包含类似于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

1 个答案:

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