【问题标题】:How to access nested or hierarchical Map structure in Scala如何在 Scala 中访问嵌套或分层 Map 结构
【发布时间】:2018-02-12 22:30:40
【问题描述】:

我有大量嵌套/分层地图格式的数据。我正在使用 Scala 和 spark 流,对此我很陌生。可以说示例流数据实例/行看起来像 - 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 -> 读取数据, bpp -> 40)

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

【问题讨论】:

  • 如果您可以避免在类型中首先使用Any 获取值,那么您通常应该致力于这样做。如果您在处理Any 时遇到问题,通常应该将问题分为两部分:1)将无类型数据转换为完全类型,2)处理数据。

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


【解决方案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)

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

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

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

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

【讨论】:

  • 实际上我有这样的数据流,而不仅仅是一个地图,所以它不起作用。
猜你喜欢
  • 2017-02-19
  • 2019-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-25
  • 2021-09-15
  • 1970-01-01
相关资源
最近更新 更多