博客
关于我
search(13)- elastic4s-histograms:聚合直方图
阅读量:456 次
发布时间:2019-03-06

本文共 5151 字,大约阅读时间需要 17 分钟。

Elasticsearch 聚合统计实战:连续型与离散型数据的处理

在数据分析中,Elasticsearch 的聚合功能是处理海量数据的利器。无论是连续型数据(如时间、价格)还是离散型数据(如地点、产品),都可以通过合理的聚合方式,提取出有价值的信息。本文将从基础到高级,逐步讲解如何在 Elasticsearch 中实现不同类型数据的聚合统计。

按价格段聚合:连续型数据的处理

背景

连续型数据(如价格、时间等)通常需要通过等间隔的方式进行分组。Elasticsearch 提供了 histogram 聚合功能,适用于对连续型数据进行分类统计。

实现步骤

  • 定义聚合类型

    _search 请求中,使用 aggs 参数定义聚合。histogram 聚合需要指定 field(数据字段)和 interval(间隔值)。

  • 子聚合

    histogram 之后,可以定义子聚合(subAggregations),用于对每个分组的进一步统计。本例使用 sum 聚合计算每个价格段的销售总额。

  • 执行查询

    发送聚合请求,获取结果。Elasticsearch 会返回一个包含分组信息的 JSON 对象。

  • 示例代码

    POST /cartxns/_search?size=1{  "aggs": {    "sales_per_pricerange": {      "histogram": {        "field": "price",        "interval": 20000      },      "aggs": {        "total_sales": {          "sum": {            "field": "price"          }        }      }    }  }}

    结果解读

    执行上述查询后,返回结果中的 buckets 数组包含每个价格段的详细信息,如 doc_counttotal_sales。以下是示例结果:

    {  "aggregations": {    "sales_per_pricerange": {      "buckets": [        {          "key": 0.0,          "doc_count": 3,          "total_sales": {            "value": 37000.0          }        },        {          "key": 20000.0,          "doc_count": 4,          "total_sales": {            "value": 95000.0          }        },        // ... 其他分组结果      ]    }  }}

    按车款聚合:离散型数据的处理

    背景

    离散型数据(如车款名称)通常具有明确的分类属性,适合使用 terms 聚合来进行分组统计。在这种聚合类型下,可以对每个分类(如车款)进行多维度的统计,如平均值、最大值和最小值。

    实现步骤

  • 定义聚合类型

    使用 terms 聚合来定义离散型数据的分组。terms 聚合会根据字段值自动分组。

  • 子聚合

    terms 之后,可以定义多个子聚合,分别计算每个分类的平均价格、最大价格和最小价格。

  • 执行查询

    发送聚合请求,获取结果。Elasticsearch 会返回一个包含分类信息的 JSON 对象。

  • 示例代码

    POST /cartxns/_search?size=1{  "aggs": {    "avage_price_per_model": {      "terms": {        "field": "make.keyword"      },      "aggs": {        "average_price": {          "avg": {            "field": "price"          }        },        "max_price": {          "max": {            "field": "price"          }        },        "min_price": {          "min": {            "field": "price"          }        }      }    }  }}

    结果解读

    执行上述查询后,返回结果中的 buckets 数组包含每个车款的详细信息,如 doc_count、平均价格、最大价格和最小价格。以下是示例结果:

    {  "aggregations": {    "avage_price_per_model": {      "buckets": [        {          "key": "honda",          "doc_count": 3,          "max_price": {            "value": 20000.0          },          "average_price": {            "value": 16666.666666666668          },          "min_price": {            "value": 10000.0          }        },        {          "key": "ford",          "doc_count": 2,          "max_price": {            "value": 30000.0          },          "average_price": {            "value": 27500.0          },          "min_price": {            "value": 25000.0          }        },        // ... 其他车款结果      ]    }  }}

    日期聚合:时间序列数据的处理

    背景

    日期数据是分析时间趋势的重要来源。Elasticsearch 提供了 date_histogram 聚合功能,可以将日期数据按特定间隔(如月、周)进行分组。

    实现步骤

  • 定义聚合类型

    使用 date_histogram 聚合来定义日期分组。date_histogram 需要指定 field(日期字段)、calendar_interval(时间间隔)和 format(日期格式)。

  • 执行查询

    发送聚合请求,获取结果。Elasticsearch 会返回一个包含日期分组信息的 JSON 对象。

  • 示例代码

    POST /cartxns/_search?size=1{  "aggs": {    "sales_per_month": {      "date_histogram": {        "field": "sold",        "calendar_interval": "1M",        "format": "yyyy-MM-dd"      }    }  }}

    结果解读

    执行上述查询后,返回结果中的 buckets 数组包含每个月的详细信息,如 doc_count 和日期值。以下是示例结果:

    {  "aggregations": {    "sales_per_month": {      "buckets": [        {          "key_as_string": "2014-01-01",          "key": 1388534400000,          "doc_count": 1        },        {          "key_as_string": "2014-02-01",          "key": 1391212800000,          "doc_count": 1        },        // ... 其他月份结果      ]    }  }}

    组合聚合:多维度数据分析

    在某些场景中,可能需要对同一数据集执行多种聚合操作。例如,可以先按月份聚合,然后再对每个月份的数据按车款分组,最后计算每个车款的销售总额。

    实现步骤

  • 定义主聚合

    使用 date_histogram 对日期数据进行分组。

  • 定义子聚合

    在主聚合的基础上,使用 terms 聚合对车款进行分组。每个车款分组再使用 sum 聚合计算销售总额。

  • 执行查询

    发送聚合请求,获取结果。

  • 示例代码

    POST /cartxns/_search?size=1{  "aggs": {    "sales_per_month": {      "date_histogram": {        "field": "sold",        "calendar_interval": "1M",        "format": "yyyy-MM-dd"      },      "aggs": {        "month_make": {          "terms": {            "field": "make.keyword",            "size": 10          },          "aggs": {            "month_total_per_make": {              "sum": {                "field": "price"              }            }          }        },        "monthly_total": {          "sum": {            "field": "price"          }        }      }    }  }}

    结果解读

    执行上述查询后,返回结果中的 buckets 数组包含每个月份的详细信息。每个月份的信息包括车款分组和销售总额。以下是示例结果:

    {  "aggregations": {    "sales_per_month": {      "buckets": [        {          "key_as_string": "2014-01-01",          "key": 1388534400000,          "doc_count": 1,          "month_make": {            "doc_count_error_upper_bound": 0,            "sum_other_doc_count": 0,            "buckets": [              {                "key": "bmw",                "doc_count": 1,                "month_total_per_make": {                  "value": 80000.0                }              }            ]          },          "monthly_total": {            "value": 80000.0          }        },        // ... 其他月份结果      ]    }  }}

    Elasticsearch 聚合的高级应用

    通过合理组合不同的聚合类型,可以对数据进行多维度分析。例如,可以按月份分组并按车款分组,最终计算每个车款在每个月的销售总额和平均价格。这种高级聚合方式对于分析时间序列数据中的业务表现尤为有用。

    通过以上方法,可以在 Elasticsearch 中高效地处理各种类型的数据,提取出有价值的信息,支持数据驱动的决策和分析需求。

    转载地址:http://qzefz.baihongyu.com/

    你可能感兴趣的文章
    nrf开发笔记一开发软件
    查看>>
    NSDateFormatter的替代方法
    查看>>
    NSOperation基本操作
    查看>>
    NSSet集合 无序的 不能重复的
    查看>>
    NT AUTHORITY\NETWORK SERVICE 权限问题
    查看>>
    ntko文件存取错误_苹果推送 macOS 10.15.4:iCloud 云盘文件夹共享终于来了
    查看>>
    nullnullHuge Pages
    查看>>
    numpy 用法
    查看>>
    Numpy如何使用np.umprod重写range函数中i的python
    查看>>
    oauth2-shiro 添加 redis 实现版本
    查看>>
    OAuth2.0_JWT令牌-生成令牌和校验令牌_Spring Security OAuth2.0认证授权---springcloud工作笔记148
    查看>>
    OAuth2.0_JWT令牌介绍_Spring Security OAuth2.0认证授权---springcloud工作笔记147
    查看>>
    OAuth2.0_介绍_Spring Security OAuth2.0认证授权---springcloud工作笔记137
    查看>>
    OAuth2.0_完善环境配置_把资源微服务客户端信息_授权码存入到数据库_Spring Security OAuth2.0认证授权---springcloud工作笔记149
    查看>>
    OAuth2.0_授权服务配置_Spring Security OAuth2.0认证授权---springcloud工作笔记140
    查看>>
    OAuth2.0_授权服务配置_令牌服务和令牌端点配置_Spring Security OAuth2.0认证授权---springcloud工作笔记143
    查看>>
    OAuth2.0_授权服务配置_客户端详情配置_Spring Security OAuth2.0认证授权---springcloud工作笔记142
    查看>>
    OAuth2.0_授权服务配置_密码模式及其他模式_Spring Security OAuth2.0认证授权---springcloud工作笔记145
    查看>>
    OAuth2.0_授权服务配置_资源服务测试_Spring Security OAuth2.0认证授权---springcloud工作笔记146
    查看>>
    OAuth2.0_环境介绍_授权服务和资源服务_Spring Security OAuth2.0认证授权---springcloud工作笔记138
    查看>>