我有嵌套/分层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但我没有获得所需的输出。请告知我如何检索所需信息。
答案 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。