【发布时间】:2016-03-27 10:12:28
【问题描述】:
我有一个带有key -> Map(key1 -> Map(), key2 -> Map()) 表示形式的嵌套映射,它基本上表示发出的特定 HTTP 请求的路径结构。
root/twiki/bin/edit/Main/Double_bounce_sender
root/twiki/bin/rdiff/TWiki/NewUserTemplate
我已将它们存储在地图地图中,这将为我提供路径的层次结构。使用解析器,我从服务器日志中读取数据并获取所需的相应数据,然后在排序映射中索引数据。
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]
}
}
get data 方法调用每个输入列表并将其发送到构建地图的 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())))))))
寻找有关如何实施此解决方案并获得最终地图的建议,该地图在一张地图中包含服务器日志文件中存在的所有可能路径。
【问题讨论】: