Beats:运用 Elastic Stack 分析 COVID-19 数据并进行可视化分析 - 续

167 篇文章 31 订阅
91 篇文章 73 订阅

首先,我想说的是这篇文章是我之前的一篇文章 “Beats:运用Elastic Stack分析COVID-19数据并进行可视化分析” 的续集。在今天的这篇文章中,我们来针对中国区域里的疫情按照每个省来进行展示数据。这个在之前的教程里是缺失的。这个也就是 regional map。如果大家想对 regional map 感兴趣的话,可以参阅我之前的另外一篇文章 “Kibana:在Kibana中定制Regional Map” 来了解如何定制一个 regional map。

在之前的索引中 covid,由于一些原因,那个 city 应该理解为 province。当初在解析数据的时候,由于有外国的数据,当时没有注意到这个。在这里纠正一些。

 

运用 Kibana 查看 covid19 索引

GET  covid19/_search
{
  "query": {
    "match": {
      "country": "China"
    }
  }
}

我们通过上面的查询,可以找到所有 China 的文档:

如我前面所述的,由于一些原因city在我们的文档中应该理解为省,也即 province。如上图所示,它显示了一个 city 为 Hubei 的文档。那么我们该如何在地图中显示这个数据呢?答案是 regional map。通过 regional map,我们可以把整个湖北省在地图上显示出来,并显示在这个省里的疫情信息。

EMS

EMS 也即 Elastic Map Service。我们可以打开 EMS:https://maps.elastic.co/v7.6/index.html?locale=en#file/china_provinces:

我们要记得在左边可以选择我们想要的 region。如图所示,上面显示中国地区的所有 region。我们可以同时发现在下面的 Guangxi Zhuang Autonomous Region。显然这个名字和我们的数据中的 Guangxi 是不相符的。同时,我还发现 Ningxia Hui Autonomous Region 在我们的数据表格中是 Ningxia,Taiwan Province 为 Taiwan。为了能够正确把数据在 EMS 中做显示,我们必须对这几个数据做分别处理。那么我们该如何做呢?

 

运用 script processor 对 city 字段进行处理

Script processor 允许我们在 Pipeline 中对我们的数据运行一段脚本,并对它们进行处理。为此,我们重新设计我们的 pipeline:

PUT _ingest/pipeline/covid19_parser
{
  "processors": [
    {
      "remove": {
        "field": ["log", "input", "ecs", "host", "agent"],
        "if": "ctx.log != null && ctx.input != null && ctx.ecs != null && ctx.host != null && ctx.agent != null"
      }
    },
    {
      "gsub": {
        "field": "message",
        "pattern": "\"",
        "replacement": "'"
      }
    },
    {
     "grok": {
        "field": "message",
        "patterns": [
          "%{NUMBER:lat:float},%{NUMBER:lon:float},'%{DATA:address}',%{DATA:city},',',%{DATA:country},%{NUMBER:infected:int},%{NUMBER:death:int}"
        ]
      }
    },
    {
      "set": {
        "field": "location.lat",
        "value": "{{lat}}"
      }
    },
    {
      "set": {
        "field": "location.lon",
        "value": "{{lon}}"
      }
    },
    {
      "script": {
        "source": """ 
        if(ctx.city == "Taiwan") {
          ctx.city = "Taiwan Province"
        }

         if(ctx.city == "Ningxia") {
          ctx.city = "Ningxia Hui Autonomous Region"
        }

        if(ctx.city == "Guangxi") {
          ctx.city = "Guangxi Zhuang Autonomous Region"
        }
        """
      }
    }              
  ]
}

请注意上面的 script 脚本部分。它帮我们检测 city 字段是否为 Taiwan,如果是的话,那么就用 Taiwn Province 来代替。等我们执行完上面的 pipeline 后,我们再次执行如下的代码:

POST covid19/_update_by_query?pipeline=covid19_parser

经过上面的 pipeline 的执行后,我们的数据就变成为我们所希望的那样:

GET covid19/_search?size=100
{
  "query": {
    "match": {
      "city": "Guangxi Zhuang Autonomous Region"
    }
  }
}

显示的数据为:

    "hits" : [
      {
        "_index" : "covid19",
        "_type" : "_doc",
        "_id" : "jYcqEHEBPWmYf6MmsLsg",
        "_score" : 5.634789,
        "_source" : {
          "country" : "China",
          "infected" : 254,
          "address" : "Guangxi, China",
          "death" : 2,
          "city" : "Guangxi Zhuang Autonomous Region",
          "lon" : 109.0,
          "message" : "24,109,'Guangxi, China',Guangxi,',',China,254,2,250",
          "@timestamp" : "2020-03-25T05:29:23.668Z",
          "location" : {
            "lon" : "109.0",
            "lat" : "24.0"
          },
          "lat" : 24.0
        }
      }
    ]

至此,我们的数据完全符合我们的要求。在下面,我们利用 EMS 来对每个省或地区进行展示。

 

运用 EMS 来展示数据

我们首先打开我们之前的 Dashboard:

 

我们点击 Map 右上角的设置图标,然后点击 Edit map:

我们想在当前的图层中添加一个图层:

我们选择 EMS Boundaries:

在上面我们要选择 China Provinces。点击 Add layer:

在上面我们选择 name (zh),这样可以显示中文的名字。我们点击 and use metric 后,显示:

我们想显示是每个省的总感染数,而不是默认情况先的文档的 count。我们接着向下滚动:

我们点击 Save & close:

在上面点击Save。这样我们就完成了对map的修改。如果我们点击湖北省的话,我们可以看到:

更新后的 Dashboard 显示为:

 

在今天的教程中,我没有使用 World map 为其它的地区做 regional map。这其中可能有一些 city 字段的值和 EMS 中的不太一样。我就不做了。如果你感兴趣的话,可以尝试一下。这个练习就留给你们了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值