2016-12-20 84 views
0

我想訪問包含類似於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)) 

我如何可以訪問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

您可以使用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) 
+0

你的第一個解決方案的回報:任何= WrappedArray(0.5,0.6666666666666666) 我怎麼能訪問第一個雙重價值? –

+0

由於Array是WrappedArray類型,例如沒有真正的陣列,我不清楚如何訪問它。 –

+0

@GeorgHeiler離開這樣,你可以有一個空的數組,所以你需要測試它。你可以通過'nestedArray.headOption'來獲得一個選項[Double],然後你可以測試它的空白。或者,您可以將第二個'getOrElse'更改爲'getOrElse(「A」,Array(0.0))'以確保該數組不是空的,然後就可以執行'nestedArray.head'。 –