如何在Scala中访问嵌套或分层的Map结构

时间:2018-02-12 14:12:48

标签: scala spark-streaming key-value scala-collections

我有嵌套/分层Map格式的大量数据。我正在使用Scala和spark streaming,我很新。让我们说样本流数据实例/行看起来像 - 地图(nd - > 1,du - > 870,dg - > Map(),确实 - > GO37,主机 - > 11.1.1.22,sg - > Map(),nfw - > Map( dst_ip - > 11.1.1.23,v - > 1,src_ip - > 11.1.1.11,pkts - > 1),dnname - > RG,app_name - >读取数据,bpp - > 40)

如何阅读' dst_ip' 值?因为我想阅读' dst_ip' 的所有实例并计算它的计数。我尝试了各种方法,如get,option但我没有获得所需的输出。请告知我如何检索所需信息。

1 个答案:

答案 0 :(得分:1)

给出

val myMap: Map[String, Any] = Map(
  "nd" -> 1,
  "du" -> 870,
  "dg" -> Map(),
  "did" -> "GO37",
  "host" -> "11.1.1.22",
  "sg" -> Map(),
  "nfw" -> Map(
    "dst_ip" -> "11.1.1.23",
    "v" -> 1,
    "src_ip" -> "11.1.1.11",
    "pkts" -> 1),
  "dnname" -> "RG",
  "app_name" -> "read data",
  "bpp" -> 40)

您可以使用模式匹配来专门处理作为地图的值。其他类型的值,您将返回None,由于flatMap将过滤它们。对于Map类型的值,您可以获得key" dst_ip"的值。 (value.get返回值的选项,这样没有此键的地图将返回None并被过滤掉):

myMap.flatMap{
  case (_, value: Map[String, Any]) =>  value.get("dst_ip")
  case _ => None
}

在您的示例中,您只有一次出现的值包含一个感兴趣的Map,但您建议可能会有更多这样的值。因此flatMap返回一个列表。

要获取这些实例的计数,只需在返回的List上调用.size。