带你读《Elastic Stack 实战手册》之61:——3.5.17.Elasticsearch SQL (5)

简介: 带你读《Elastic Stack 实战手册》之61:——3.5.17.Elasticsearch SQL (5)


《Elastic Stack 实战手册》——三、产品能力——3.5 进阶篇——3.5.17.Elasticsearch SQL (4) https://developer.aliyun.com/article/1227074


5. 聚合分析

 

Elasticsearch 的聚合分析功能非常强大,在实际生产环境中,通过聚合分析再结合图表展示,我们可以实现许多实用功能,例如:查看网站访问 IP 分布情况,某些服务的 P99 延迟等等。

 

5.1 复合聚合


Elasticsearch SQL 中提供了 group by 语法用于桶聚合分析,对于 group by 语法,Elasticsearch 内部将转换为复合聚合(composite aggregation)。

 

例如:下面的查询根据返回状态码分类,统计对应的 http 请求的 body 字节大小平均值和请求次数。


POST _sql/translate
{
  "query":"""
    SELECT response, count(*) AS count_docs, 
    avg(bytes) AS avg_bytes 
    FROM test_logs 
    GROUP BY response
  """
}
{
  "size" : 0,
  "_source" : false,
  "aggregations" : {
    "groupby" : {
      "composite" : {
        "size" : 1000,
        "sources" : [
          {
            "565ba6a7" : {
              "terms" : {
                "field" : "response.keyword",
                "missing_bucket" : true,
                "order" : "asc"
              }
            }
          }
        ]
      },
      "aggregations" : {
        "945f09f1" : {
          "avg" : {
            "field" : "bytes"
               }
        }
          }
    }
  }
}
POST _sql?format=txt
{
  "query":"""
    SELECT response, count(*) AS count_docs, 
    avg(bytes) AS avg_bytes 
    FROM test_logs 
    GROUP BY response
  """
}
   response    |  count_docs   |    avg_bytes    
---------------+---------------+-----------------
200            |12832          |5897.852711970075
404            |801            |5049.242197253433
503            |441            |0.0              

5.2 多层聚合

 

既然 group by 会被转化为复合聚合,我们可以通过 group by 多个字段,实现多层聚合。

 

例如:我们对测试数据(访问日志),先通过访问域名分类,然后再根据返回状态码分类,统计对应的 http 请求的 body 字节大小平均值 。


POST _sql?format=txt
{
  "query":"""
    SELECT host, response,
    avg(bytes) AS avg_bytes 
    FROM test_logs 
    GROUP BY host, response
  """
}
             host              |   response    |    avg_bytes    
-------------------------------+---------------+-----------------
artifacts.elastic.co           |200            |6449.373109243697
artifacts.elastic.co           |404            |6111.981818181818
artifacts.elastic.co           |503            |0.0             
cdn.elastic-elastic-elastic.org|200            |5771.631123919308
cdn.elastic-elastic-elastic.org|404            |5527.292452830188
cdn.elastic-elastic-elastic.org|503            |0.0              
elastic-elastic-elastic.org    |200            |4775.802409638554
elastic-elastic-elastic.org    |404            |2397.616         
elastic-elastic-elastic.org    |503            |0.0              
www.elastic.co                 |200            |5315.617331812999
www.elastic.co                 |404            |4757.891666666666
www.elastic.co                 |503            |0.0              

5.3 直方图

 

在我们的使用场景中,经常需要对日期进行直方图聚合,Elasticsearch SQL中存在histogram函数,可以实现。


POST _sql?format=txt
{
  "query":"""
SELECT host, 
 HISTOGRAM(timestamp, INTERVAL 1 MONTH) as h, 
    count(*) AS count_docs
    FROM test_logs 
    GROUP BY host, h
  """
}
             host              |           h            |  count_docs   
-------------------------------+------------------------+---------------
artifacts.elastic.co           |2021-10-01T00:00:00.000Z|124            
artifacts.elastic.co           |2021-11-01T00:00:00.000Z|3141           
artifacts.elastic.co           |2021-12-01T00:00:00.000Z|3223           
cdn.elastic-elastic-elastic.org|2021-10-01T00:00:00.000Z|33             
cdn.elastic-elastic-elastic.org|2021-11-01T00:00:00.000Z|1123           
cdn.elastic-elastic-elastic.org|2021-12-01T00:00:00.000Z|1099           
elastic-elastic-elastic.org    |2021-10-01T00:00:00.000Z|5              
elastic-elastic-elastic.org    |2021-11-01T00:00:00.000Z|215            
elastic-elastic-elastic.org    |2021-12-01T00:00:00.000Z|332            
www.elastic.co                 |2021-10-01T00:00:00.000Z|87             
www.elastic.co                 |2021-11-01T00:00:00.000Z|2371           
www.elastic.co                 |2021-12-01T00:00:00.000Z|2321           

5.4 聚合分页

 

在实际使用场景中,如果分桶过多,可能会出现消耗过多资源、查询响应超时、经典的桶太多报错(too many buckets)等问题。幸运的是,我们可以通过聚合分页,避免上面的查询问题,而通过 Elasticsearch SQL 的 group by 和 fetch_size 结合使用,聚合分页将变得十分简洁。


# 第1次查询,指定 fetch_size=10
POST _sql?format=json
{
  "query":"""
SELECT host, response, 
  count(*) AS count_docs, 
    avg(bytes) AS avg_bytes 
    FROM test_logs 
    GROUP BY host, response
  """,
  "fetch_size": 10
}
{
  "columns" : [
    {
      "name" : "host",
      "type" : "text"
    },
    {
      "name" : "response",
      "type" : "text"
    },
    {
      "name" : "count_docs",
      "type" : "long"
    },
    {
      "name" : "avg_bytes",
      "type" : "double"
    }
  ],
  "rows" : [
    [
      "artifacts.elastic.co",
      "200",
      5950,
      6449.373109243697
        ],
    ...
  ],
   "cursor" : "g+azAwFaA...="
}
# 第2次查询(也即最后1次查询)
POST _sql?format=json
{
  "cursor" : "g+azAwFaA...="
}

5.5 管道聚合

 

实际使用过程中,我们经常需要对聚合结果,再次过滤,而通过管道聚合可以轻松实现。在

Elasticsearch SQL 中,提供了 having 语法,实现相同的管道聚合功能。

 

例如:我们先根据 host,response 分类,然后计算出每个分类的请求次数,还需要过滤count_docs <= 1000 的分类。

OST _sql?format=txt
{
  "query":"""
    SELECT host, response, 
    count(*) AS count_docs
    FROM test_logs 
    GROUP BY host, response 
    HAVING count_docs > 1000
  """
}
             host              |   response    |  count_docs   
             -------------------------------+---------------+---------------
artifacts.elastic.co           |200            |5950           
cdn.elastic-elastic-elastic.org|200            |2082           
www.elastic.co                 |200            |4385           

 



相关实践学习
以电商场景为例搭建AI语义搜索应用
本实验旨在通过阿里云Elasticsearch结合阿里云搜索开发工作台AI模型服务,构建一个高效、精准的语义搜索系统,模拟电商场景,深入理解AI搜索技术原理并掌握其实现过程。
ElasticSearch 最新快速入门教程
本课程由千锋教育提供。全文搜索的需求非常大。而开源的解决办法Elasricsearch(Elastic)就是一个非常好的工具。目前是全文搜索引擎的首选。本系列教程由浅入深讲解了在CentOS7系统下如何搭建ElasticSearch,如何使用Kibana实现各种方式的搜索并详细分析了搜索的原理,最后讲解了在Java应用中如何集成ElasticSearch并实现搜索。 &nbsp;
相关文章
|
SQL 分布式计算 DataWorks
DataWorks产品使用合集之如何在SQL语句里使用CASE WHEN语句
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
466 2
|
SQL 关系型数据库 分布式数据库
PolarDB产品使用问题之相同的SQL语句在不同时间执行EXPLAIN计划显示出不同的索引类型,是什么原因
PolarDB产品使用合集涵盖了从创建与管理、数据管理、性能优化与诊断、安全与合规到生态与集成、运维与支持等全方位的功能和服务,旨在帮助企业轻松构建高可用、高性能且易于管理的数据库环境,满足不同业务场景的需求。用户可以通过阿里云控制台、API、SDK等方式便捷地使用这些功能,实现数据库的高效运维与持续优化。
PolarDB产品使用问题之相同的SQL语句在不同时间执行EXPLAIN计划显示出不同的索引类型,是什么原因
|
SQL 分布式计算 DataWorks
DataWorks产品使用合集之未保存的ODPS SQL语句该如何找回
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
201 2
|
SQL 关系型数据库 分布式数据库
PolarDB产品使用问题之遇到慢SQL问题,该如何解决
PolarDB产品使用合集涵盖了从创建与管理、数据管理、性能优化与诊断、安全与合规到生态与集成、运维与支持等全方位的功能和服务,旨在帮助企业轻松构建高可用、高性能且易于管理的数据库环境,满足不同业务场景的需求。用户可以通过阿里云控制台、API、SDK等方式便捷地使用这些功能,实现数据库的高效运维与持续优化。
|
SQL 弹性计算 资源调度
云服务器 ECS产品使用问题之bin/spark-sql --master yarn如何进行集群模式运行
云服务器ECS(Elastic Compute Service)是各大云服务商阿里云提供的一种基础云计算服务,它允许用户租用云端计算资源来部署和运行各种应用程序。以下是一个关于如何使用ECS产品的综合指南。
|
SQL 关系型数据库 分布式数据库
PolarDB产品使用问题之sql运行报错是神么原因
PolarDB产品使用合集涵盖了从创建与管理、数据管理、性能优化与诊断、安全与合规到生态与集成、运维与支持等全方位的功能和服务,旨在帮助企业轻松构建高可用、高性能且易于管理的数据库环境,满足不同业务场景的需求。用户可以通过阿里云控制台、API、SDK等方式便捷地使用这些功能,实现数据库的高效运维与持续优化。
|
SQL 关系型数据库 Serverless
PolarDB产品使用问题之如何控制队列中排队的SQL的等待时间
PolarDB产品使用合集涵盖了从创建与管理、数据管理、性能优化与诊断、安全与合规到生态与集成、运维与支持等全方位的功能和服务,旨在帮助企业轻松构建高可用、高性能且易于管理的数据库环境,满足不同业务场景的需求。用户可以通过阿里云控制台、API、SDK等方式便捷地使用这些功能,实现数据库的高效运维与持续优化。
|
关系型数据库 分布式数据库 数据库
PolarDB产品使用问题之将RDS切换到PolarDB-X 2.0时,代码层的SQL该如何改动
PolarDB产品使用合集涵盖了从创建与管理、数据管理、性能优化与诊断、安全与合规到生态与集成、运维与支持等全方位的功能和服务,旨在帮助企业轻松构建高可用、高性能且易于管理的数据库环境,满足不同业务场景的需求。用户可以通过阿里云控制台、API、SDK等方式便捷地使用这些功能,实现数据库的高效运维与持续优化。
|
SQL 关系型数据库 分布式数据库
PolarDB产品使用问题之出现部分SQL抛出7543错误,该如何解决
PolarDB产品使用合集涵盖了从创建与管理、数据管理、性能优化与诊断、安全与合规到生态与集成、运维与支持等全方位的功能和服务,旨在帮助企业轻松构建高可用、高性能且易于管理的数据库环境,满足不同业务场景的需求。用户可以通过阿里云控制台、API、SDK等方式便捷地使用这些功能,实现数据库的高效运维与持续优化。
|
SQL 缓存 关系型数据库
PolarDB产品使用问题之SQL语句是否可以参数化
PolarDB产品使用合集涵盖了从创建与管理、数据管理、性能优化与诊断、安全与合规到生态与集成、运维与支持等全方位的功能和服务,旨在帮助企业轻松构建高可用、高性能且易于管理的数据库环境,满足不同业务场景的需求。用户可以通过阿里云控制台、API、SDK等方式便捷地使用这些功能,实现数据库的高效运维与持续优化。

热门文章

最新文章

相关产品

  • 检索分析服务 Elasticsearch版