我有一個key -> Map(key1 -> Map(), key2 -> Map())
有點類似的嵌套地圖,它基本上代表了一個特定的HTTP請求的路徑結構。在scala中合併兩個嵌套的地圖
root/twiki/bin/edit/Main/Double_bounce_sender root/twiki/bin/rdiff/TWiki/NewUserTemplate
我已經將它們存儲在一個Map地圖,這將使我的路徑的層次。使用解析器,我從服務器日誌中讀取數據並獲取所需的相應數據,然後將數據編入索引映射中。
val mainList: RDD[List[String]] = requesturl flatMap (r => r.toString split("\\?") map (x => parser(x.split("/").filter(x => !x.contains("=")).toList).valuesIterator.toList))
def parser(list: List[String]): Map[Int, String]= {
val m = list.zipWithIndex.map(_.swap).toMap
val sM = SortedMap(m.toSeq:_*)
sM.+(0 -> "root")
}
結構中獲得數據所需後,我通過整個集合結構中的數據轉換成路徑地圖環路會是什麼樣子
root - twiki - bin - edit - Main - Double_bounce_sender -rdiff - TWiki - NewUserTemplate - oops - etc - local - getInterface
type innerMap = mutable.HashMap[String, Any]
def getData(input: RDD[List[String]]): mutable.HashMap[String, innerMap] ={
var mainMap = new mutable.HashMap[String, innerMap]
for(x <- input){
val z: mutable.HashMap[String, innerMap] = storeData(x.toIterator, mainMap ,x(0).toString)
mainMap = mainMap ++ z
}
mainMap
}
def storeData(list: Iterator[String], map: mutable.HashMap[String, innerMap], root: String): mutable.HashMap[String, innerMap]={
list.hasNext match {
case true =>
val v = list.next()
val y = map contains (root) match {
case true =>
println("Adding when exists: "+v)
val childMap = map.get(v).get match {
case _:HashMap[String, Any] => asInstanceOf[mutable.HashMap[String, innerMap]]
case _ => new mutable.HashMap[String, innerMap]
}
val x = map + (v -> storeData(list, childMap, v))
x
case false =>
val x = map + (v -> storeData(list, new mutable.HashMap[String, innerMap], v))
x
}
y.asInstanceOf[mutable.HashMap[String, innerMap]]
case false =>
new mutable.HashMap[String, innerMap]
}
}
獲取數據的方法調用每個輸入列表並將其發送到構建地圖的storeData方法。
我被困在兩個地方。
- 遞歸發送到storeData的MainMap(HashMap [String,innerMap])每次都作爲一個新的空映射。
- 第二個問題是,我試圖找出合併2個嵌套的地圖沒有定義長度的方法。如合併下面的地圖。
Map(root -> Map(twiki -> Map(bin -> Map(edit -> Map(Main -> Map(Double -> Map()))))))) Map(root -> Map(twiki -> Map(bin -> Map(rdiff -> Map(TWiki -> Map(NewUser -> Map())))))))
尋找建議我如何能實現此解決方案,並得到一個包含所有存在於服務器日誌文件在一個地圖的可能路徑的最終地圖。
該解決方案可能有效,但所需輸出必須稍微有點不同。根據上面的解決方案,輸出將是 'Map(root - > Map(bin - > Map(sh - > Map(),csh - > Map()),usr - > Map()))', 但它應該是 '映射(根 - >映射(bin - >映射(sh - >映射(),csh - >映射(usr - >映射()))))'' – elric