【Elasticsearch 】 聚合分析:桶聚合

🧑 博主简介:CSDN博客专家历代文学网(PC端可以访问:https://literature.sinhy.com/#/?__c=1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编程高并发设计Springboot和微服务,熟悉LinuxESXI虚拟化以及云原生Docker和K8s,热衷于探索科技的边界,并将理论知识转化为实际应用。保持对新技术的好奇心,乐于分享所学,希望通过我的实践经历和见解,启发他人的创新思维。在这里,我希望能与志同道合的朋友交流探讨,共同进步,一起在技术的世界里不断学习成长。
技术合作请加本人wx(注明来自csdn):foreast_sea

在这里插入图片描述


在这里插入图片描述

【Elasticsearch 】 聚合分析:桶聚合

引言

在当今数据爆炸的时代,如何从海量数据中提取有价值的信息成为了众多开发者和数据分析师面临的重要挑战。Elasticsearch 作为一款强大的分布式搜索引擎,不仅提供了高效的数据存储和检索功能,还具备强大的聚合分析能力,其中桶聚合是其聚合分析功能的核心组成部分。

桶聚合的概念源于数据分析中常见的分组操作,它能够根据特定的条件将数据划分成不同的“桶”,每个桶代表一组具有相同特征的数据集合。通过这种方式,我们可以对数据进行分类、汇总和统计,从而挖掘出数据背后隐藏的模式和规律。

想象一下,你正在处理一个电商平台的销售数据,其中包含了大量的订单信息,如订单时间、商品类别、购买金额等。通过桶聚合,你可以轻松地按照商品类别对订单进行分组,统计每个类别的销售总额,了解哪些商品最受欢迎;或者按照订单时间进行分组,分析不同时间段的销售趋势,为营销策略提供有力支持。

在实际应用中,桶聚合的类型丰富多样,能够满足各种复杂的数据分析需求。常见的桶聚合类型包括 terms 桶聚合、date_histogram 桶聚合、range 桶聚合等。这些不同类型的桶聚合,各自适用于不同的数据特征和分析场景,为我们提供了灵活而强大的数据处理手段。

掌握桶聚合的使用方法,不仅可以帮助我们更好地理解数据,还能为业务决策提供准确的数据支持。无论是在数据分析、数据挖掘还是机器学习等领域,Elasticsearch 的桶聚合都发挥着重要的作用。

在本文,让我们一起深入探索 Elasticsearch 桶聚合的世界,揭开它神秘的面纱,领略其在数据处理中的强大魅力。

一、Elasticsearch 简介

Elasticsearch 是一个基于 Lucene 的分布式、RESTful 风格的搜索和数据分析引擎。它旨在快速存储、搜索和分析大量数据,广泛应用于各种领域,如日志分析、电商搜索、企业搜索等。

(一)核心概念

  1. 索引(Index)
    索引是 Elasticsearch 中存储数据的逻辑容器,类似于关系型数据库中的数据库概念。一个索引可以包含多个文档,每个文档都有一个唯一的标识符。例如,在一个电商应用中,可以创建一个名为 products 的索引来存储所有商品的信息。

  2. 文档(Document)
    文档是 Elasticsearch 中存储的基本数据单元,它是一个 JSON 格式的数据结构。每个文档都属于一个索引,并且可以包含多个字段。以商品文档为例,可能包含 product_idproduct_namepricecategory 等字段。

  3. 类型(Type)
    在早期版本中,类型用于在一个索引中区分不同类型的文档。但从 Elasticsearch 7.x 版本开始,逐渐弱化了类型的概念,一个索引通常只包含一种类型的文档。

  4. 分片(Shard)
    为了处理大规模数据,Elasticsearch 将索引分割成多个分片,每个分片是一个独立的 Lucene 索引。分片可以分布在不同的节点上,从而实现分布式存储和并行处理,提高系统的可扩展性和性能。

  5. 副本(Replica)
    副本是分片的复制,用于提高数据的可用性和读取性能。每个分片可以有多个副本,当某个节点出现故障时,副本可以接管其工作,确保数据的正常访问。

(二)工作原理

Elasticsearch 的工作原理基于分布式架构和 Lucene 的倒排索引技术。当一个文档被索引时,Elasticsearch 会分析文档的内容,将每个字段的值拆分成一个个的词项(Term),并构建倒排索引。倒排索引是一种从词项到文档的映射结构,通过它可以快速定位包含特定词项的文档。

在搜索时,用户发送查询请求到 Elasticsearch 集群,集群中的节点会根据查询条件在倒排索引中查找匹配的文档,并将结果返回给用户。对于聚合分析,Elasticsearch 会在索引数据的基础上,按照指定的聚合规则对数据进行分组和计算。

(三)安装与配置

  1. 下载安装
    可以从 Elasticsearch 官方网站下载适合你操作系统的安装包。解压安装包后,进入安装目录,在 Linux 系统下,可以通过执行 bin/elasticsearch 脚本启动 Elasticsearch 服务;在 Windows 系统下,可以双击 bin\elasticsearch.bat 文件启动。

  2. 配置文件
    Elasticsearch 的配置文件位于 config 目录下,主要配置文件是 elasticsearch.yml。在这里可以配置集群名称、节点名称、网络绑定地址、数据存储路径等参数。例如,修改 network.host 参数可以指定 Elasticsearch 监听的网络地址,以便外部可以访问。

二、Maven 依赖

在使用 Java API 操作 Elasticsearch 进行桶聚合时,需要引入相应的 Maven 依赖。以下是详细的依赖介绍:

(一)Elasticsearch 客户端依赖

<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>elasticsearch-rest-high-level-client</artifactId>
    <version>7.17.6</version>
</dependency>

这个依赖提供了高级 REST 客户端,用于与 Elasticsearch 集群进行交互。高级 REST 客户端基于低级 REST 客户端构建,提供了更方便、更面向对象的 API,使得我们可以轻松地发送各种请求,包括索引数据、搜索数据和执行聚合操作等。

(二)Elasticsearch 核心依赖

<dependency>
    <groupId>org.elasticsearch</groupId>
    <artifactId>elasticsearch</artifactId>
    <version>7.17.6</version>
</dependency>

Elasticsearch 核心依赖包含了 Elasticsearch 的核心功能和类库。它是整个 Elasticsearch 运行的基础,提供了数据存储、索引构建、搜索算法等核心功能。在使用 Java API 进行桶聚合时,很多核心的聚合操作类和方法都来自这个依赖。

(三)其他依赖

根据具体的应用场景,可能还需要引入一些其他的依赖。例如,如果需要处理 JSON 数据,可能需要引入 Jackson 相关的依赖:

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.13.4</version>
</dependency>

Jackson 是一个流行的 JSON 处理库,它可以帮助我们将 Java 对象转换为 JSON 格式,以及将 JSON 数据解析为 Java 对象。在与 Elasticsearch 交互时,数据通常以 JSON 格式传输,因此 Jackson 依赖可以方便我们处理这些数据。

(四)依赖管理

在 Maven 项目中,这些依赖会被自动下载并添加到项目的类路径中。Maven 会根据依赖的版本信息,解析和管理依赖之间的关系,确保项目使用的所有依赖都是兼容的。同时,Maven 还提供了依赖传递的功能,即如果一个依赖依赖于其他的库,Maven 会自动下载这些传递性依赖,使得项目的依赖管理更加方便和高效。

三、常见桶聚合类型

(一)terms 桶聚合

terms 桶聚合是最常用的桶聚合类型之一,它根据指定字段的不同值对文档进行分组。每个不同的值会形成一个独立的桶,每个桶中包含所有该字段值相同的文档。

1. 语法示例

以下是使用 Java API 进行 terms 桶聚合的示例代码:

import org.apache.http.HttpHost;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.search.aggregations.AggregationBuilders;
import org.elasticsearch.search.aggregations.bucket.terms.Terms;
import org.elasticsearch.search.builder.SearchSourceBuilder;

public class TermsAggregationExample {
    public static void main(String[] args) throws Exception {
        try (RestHighLevelClient client = new RestHighLevelClient(
                RestClient.builder(
                        new HttpHost("localhost", 9200, "http")))) {

            SearchRequest searchRequest = new SearchRequest("your_index_name");
            SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();

            searchSourceBuilder.aggregation(AggregationBuilders.terms("category_agg")
                  .field("category"));

            searchRequest.source(searchSourceBuilder);
            SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);

            Terms categoryAgg = searchResponse.getAggregations().get("category_agg");
            for (Terms.Bucket bucket : categoryAgg.getBuckets()) {
                System.out.println("Category: " + bucket.getKeyAsString() + ", Doc Count: " + bucket.getDocCount());
            }
        }
    }
}

在上述代码中:

  • 首先创建了一个 RestHighLevelClient 实例,用于与 Elasticsearch 集群进行通信。
  • 然后创建了一个 SearchRequest,指定要查询的索引为 your_index_name
  • 使用 SearchSourceBuilder 构建查询请求,通过 aggregation 方法添加了一个 terms 桶聚合,聚合名称为 category_agg,分组字段为 category
  • 执行搜索请求并获取响应,从响应中获取名为 category_agg 的聚合结果,遍历每个桶并打印出分组的类别和该类别下的文档数量。
2. 应用场景

terms 桶聚合在很多场景下都非常有用。例如在电商数据分析中,可以使用 terms 桶聚合按照商品类别对订单进行分组,统计每个类别的订单数量,从而了解哪些商品类别最受欢迎。在日志分析中,可以按照日志级别对日志进行分组,统计不同级别日志的数量,以便快速定位系统中出现问题的频率。

(二)date_histogram 桶聚合

date_histogram 桶聚合用于按照日期范围对文档进行分组。它可以根据指定的时间间隔(如秒、分钟、小时、天等)将日期数据划分为不同的桶,每个桶包含在该时间范围内的文档。

1. 语法示例
import org.apache.http.HttpHost;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.search.aggregations.AggregationBuilders;
import org.elasticsearch.search.aggregations.bucket.datehistogram.DateHistogram;
import org.elasticsearch.search.builder.SearchSourceBuilder;

public class DateHistogramAggregationExample {
    public static void main(String[] args) throws Exception {
        try (RestHighLevelClient client = new RestHighLevelClient(
                RestClient.builder(
                        new HttpHost("localhost", 9200, "http")))) {

            SearchRequest searchRequest = new SearchRequest("your_index_name");
            SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();

            searchSourceBuilder.aggregation(AggregationBuilders.dateHistogram("date_agg")
                  .field("order_date")
                  .calendarInterval(DateHistogram.Interval.DAY)
                  .format("yyyy-MM-dd"));

            searchRequest.source(searchSourceBuilder);
            SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);

            DateHistogram dateAgg = searchResponse.getAggregations().get("date_agg");
            for (DateHistogram.Bucket bucket : dateAgg.getBuckets()) {
                System.out.println("Date: " + bucket.getKeyAsString() + ", Doc Count: " + bucket.getDocCount());
            }
        }
    }
}

在这段代码中:

  • 同样创建了 RestHighLevelClientSearchRequest
  • 使用 SearchSourceBuilder 添加了一个 date_histogram 桶聚合,聚合名称为 date_agg,分组字段为 order_date
  • 通过 calendarInterval 方法指定时间间隔为一天,format 方法指定日期的显示格式为 yyyy-MM-dd
  • 执行查询后,从响应中获取聚合结果并遍历每个桶,打印出日期和该日期下的文档数量。
2. 应用场景

date_histogram 桶聚合在分析时间序列数据时非常有用。比如在电商销售数据分析中,可以按照每天的订单时间进行分组,统计每天的订单数量,从而分析销售趋势。在服务器日志分析中,可以按照日志记录的时间进行分组,了解系统在不同时间段的活动情况,以便进行性能优化和故障排查。

(三)range 桶聚合

range 桶聚合根据数值范围对文档进行分组。可以指定多个数值范围,每个范围形成一个桶,文档根据其指定字段的值落入相应的桶中。

1. 语法示例
import org.apache.http.HttpHost;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.search.aggregations.AggregationBuilders;
import org.elasticsearch.search.aggregations.bucket.range.Range;
import org.elasticsearch.search.builder.SearchSourceBuilder;

public class RangeAggregationExample {
    public static void main(String[] args) throws Exception {
        try (RestHighLevelClient client = new RestHighLevelClient(
                RestClient.builder(
                        new HttpHost("localhost", 9200, "http")))) {

            SearchRequest searchRequest = new SearchRequest("your_index_name");
            SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();

            searchSourceBuilder.aggregation(AggregationBuilders.range("price_range_agg")
                  .field("price")
                  .addUnboundedTo(100)
                  .addRange(100, 200)
                  .addUnboundedFrom(200));

            searchRequest.source(searchSourceBuilder);
            SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);

            Range priceRangeAgg = searchResponse.getAggregations().get("price_range_agg");
            for (Range.Bucket bucket : priceRangeAgg.getBuckets()) {
                System.out.println("Price Range: " + bucket.getKeyAsString() + ", Doc Count: " + bucket.getDocCount());
            }
        }
    }
}

在上述代码中:

  • 创建了必要的客户端和请求对象。
  • 使用 SearchSourceBuilder 添加了一个 range 桶聚合,聚合名称为 price_range_agg,分组字段为 price
  • 通过 addUnboundedToaddRangeaddUnboundedFrom 方法定义了三个价格范围:小于等于 100、100 到 200 之间、大于 200。
  • 执行查询后,获取聚合结果并遍历每个桶,打印出价格范围和该范围内的文档数量。
2. 应用场景

range 桶聚合在数据分析中常用于对数值数据进行分段统计。例如在电商商品价格分析中,可以按照不同的价格区间对商品进行分组,了解不同价格段商品的销售情况。在用户年龄分析中,可以按照年龄范围对用户进行分组,分析不同年龄段用户的行为特征。

(四)嵌套桶聚合

在实际的数据分析中,往往需要对数据进行多层次的分组和分析,这时候就可以使用嵌套桶聚合。嵌套桶聚合是指在一个桶聚合的基础上,再在每个桶内进行另一个桶聚合,从而实现更复杂的数据分组和洞察。

接下来是具体的示例:

import org.apache.http.HttpHost;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.search.aggregations.AggregationBuilders;
import org.elasticsearch.search.aggregations.bucket.terms.ParsedTerms;
import org.elasticsearch.search.aggregations.bucket.terms.Terms;
import org.elasticsearch.search.aggregations.bucket.terms.TermsAggregationBuilder;
import org.elasticsearch.search.builder.SearchSourceBuilder;

import java.io.IOException;

public class NestedBucketAggregationExample {

    public static void main(String[] args) throws IOException {
        RestHighLevelClient client = new RestHighLevelClient(
                RestClient.builder(
                        new HttpHost("localhost", 9200, "http")));

        SearchRequest searchRequest = new SearchRequest("your_index_name");
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();

        // 外层桶聚合,按产品类别分组
        TermsAggregationBuilder outerAggregation = AggregationBuilders.terms("product_categories")
              .field("category.keyword");

        // 内层桶聚合,在每个产品类别桶内按子类别分组
        TermsAggregationBuilder innerAggregation = AggregationBuilders.terms("sub_categories")
              .field("sub_category.keyword");

        // 在内层桶聚合中计算总销售额
        innerAggregation.subAggregation(AggregationBuilders.sum("total_sales").field("sales_amount"));

        outerAggregation.subAggregation(innerAggregation);

        searchSourceBuilder.aggregation(outerAggregation);
        searchRequest.source(searchSourceBuilder);

        SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);

        // 解析结果
        ParsedTerms outerTerms = searchResponse.getAggregations().get("product_categories");
        for (Terms.Bucket outerBucket : outerTerms.getBuckets()) {
            String category = outerBucket.getKeyAsString();
            System.out.println("Category: " + category);

            ParsedTerms innerTerms = outerBucket.getAggregations().get("sub_categories");
            for (Terms.Bucket innerBucket : innerTerms.getBuckets()) {
                String subCategory = innerBucket.getKeyAsString();
                double totalSales = innerBucket.getAggregations().get("total_sales").getValue();
                System.out.println("  Sub - Category: " + subCategory + ", Total Sales: " + totalSales);
            }
        }

        client.close();
    }
}
复杂多层次嵌套场景

在实际应用中,可能会遇到更复杂的多层次嵌套需求。例如,在分析用户行为数据时,我们可能需要按日期、用户所在地区、用户年龄段进行多层次分组,然后分析每个分组下用户的平均浏览时长。

// 按日期分组
TermsAggregationBuilder dateAggregation = AggregationBuilders.terms("by_date")
      .field("date.keyword");

// 在日期分组桶内按地区分组
TermsAggregationBuilder regionAggregation = AggregationBuilders.terms("by_region")
      .field("region.keyword");

// 在地区分组桶内按年龄段分组
TermsAggregationBuilder ageGroupAggregation = AggregationBuilders.terms("by_age_group")
      .field("age_group.keyword");

// 在年龄段分组桶内计算平均浏览时长
ageGroupAggregation.subAggregation(AggregationBuilders.avg("avg_browse_time").field("browse_time"));

regionAggregation.subAggregation(ageGroupAggregation);
dateAggregation.subAggregation(regionAggregation);

searchSourceBuilder.aggregation(dateAggregation);

通过这样的多层次嵌套,可以深入了解不同时间、不同地区、不同年龄段用户的行为模式,为产品优化和营销策略制定提供有力的数据支持。

注意事项
  1. 性能问题:随着嵌套层次的增加,聚合操作的性能开销会显著增大。因为每个桶聚合都需要对数据进行一次遍历和分组。在设计嵌套聚合时,要充分考虑数据量和性能需求,避免不必要的嵌套。
  2. 内存使用:Elasticsearch 在进行聚合操作时会占用一定的内存来存储中间结果。对于大规模数据的复杂嵌套聚合,可能会导致内存不足的问题。可以通过合理设置 shard_size 等参数来控制内存使用。
  3. 数据倾斜:如果某些桶中的数据量过大,会影响聚合的性能和结果的准确性。在进行嵌套聚合前,需要对数据分布有一定的了解,必要时可以通过数据预处理来平衡数据分布。

四、总结

Elasticsearch 的桶聚合功能为我们提供了强大的数据分组和分析能力,尤其是嵌套桶聚合能够帮助我们深入挖掘数据的内在结构和分布规律。通过合理设计嵌套层次和聚合操作,结合实际业务需求,我们可以从海量数据中获取有价值的信息,为决策提供有力支持。无论是在电商、金融、日志分析还是其他领域,桶聚合都有着广泛的应用前景。

五、参考资料文献

  1. Elasticsearch 官方文档:https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html
  2. 《Elasticsearch in Action》,作者:Jeff Markham
  3. Elasticsearch 官方博客:https://www.elastic.co/blog/ ,其中包含了许多关于 Elasticsearch 各种功能使用和优化的文章。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/957218.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

学习ASP.NET Core的身份认证(基于JwtBearer的身份认证7)

本文验证基于请求头中传递token信息的认证方式&#xff0c;webapi项目的控制器类中新建如下函数&#xff0c;仅通过验证的客户端能调用&#xff0c;需要客户端请求在Header中添加’Authorization’: Bearer token’的键值对且通过token验证后才能调用。 [Authorize] [HttpGet]…

游戏AI,让AI 玩游戏有什么作用?

让 AI 玩游戏这件事远比我们想象的要早得多。追溯到 1948 年&#xff0c;图灵和同事钱伯恩共同设计了国际象棋程序 Turochamp。之所以设计这么个程序&#xff0c;图灵是想说明&#xff0c;机器理论上能模拟人脑能做的任何事情&#xff0c;包括下棋这样复杂的智力活动。 可惜的是…

9. 神经网络(一.神经元模型)

首先&#xff0c;先看一个简化的生物神经元结构&#xff1a; 生物神经元有多种类型&#xff0c;内部也有复杂的结构&#xff0c;但是可以把单个神经元简化为3部分组成&#xff1a; 树突&#xff1a;一个神经元往往有多个树突&#xff0c;用于接收传入的信息。轴突&#xff1a;…

Docker可视化管理工具Portainer

Portainer简介 Portainer 是一个轻量级的、开源的容器管理工具&#xff0c;提供了一个直观的 Web 用户界面&#xff08;UI&#xff09;&#xff0c;用于管理 Docker 和 Kubernetes 环境。它简化了容器的部署、监控和管理&#xff0c;特别适合不熟悉命令行操作的用户或团队。 …

maven helper插件使用

在intellij idea插件市场搜索maven help并安装安装好后会多一个Dependency Analyzer 场景1&#xff1a;排除某个依赖 点击完exclude pom文件会被修改 然后刷新下maven&#xff0c;相应的依赖就会被排除了。

【VRChat · 改模】Unity2019、2022的版本选择哪个如何决策,功能有何区别;

总览 1.Unity2019、2022的版本的选择 2.Unity添加着色器教程 一、Unity2019、2022的版本的选择 1.Unity2019 和 Unity2022 的区别&#xff0c;VRChat SDK 为何要区分两个版本 我是外行&#xff0c;最开始以为的是&#xff0c;2019 和 2022 的变化是基于这个模型本身的。 也…

RHCE实验详解

目录 实验分析 环境拓扑结构 项目需求 主机环境描述 实验步骤 一、密钥互信和主机名更改 二、DNS 三、NGINX 四、MARIADB 五、NFS 六、NTP 七、论坛服务 结果展示及痛点解答 实验分析 环境拓扑结构 项目需求 1. 172.25.250.101 主机上的 Web 服务要求提供 www.ex…

学Python的人…

学Python的人… 一、Python能干什么&#xff1f; 1.爬虫&#xff1a;前几年&#xff0c;深度学习还没发展起来的时候&#xff0c;书店里Python就和爬虫挂钩&#xff0c;因为Python写爬虫确实方便。 2.数据分析&#xff1a;Python有各种的数据分析库可以方便使用&#xff0…

docker 安装 mysql 详解

在平常的开发工作中&#xff0c;我们经常需要用到 mysql 数据库。那么在docker容器中&#xff0c;应该怎么安装mysql数据库呢。简单来说&#xff0c;第一步&#xff1a;拉取镜像&#xff1b;第二步&#xff1a;创建挂载目录并设置 my.conf&#xff1b;第三步&#xff1a;启动容…

华为E9000刀箱服务器监控指标解读

美信监控易内置了数千种常见设备监测器&#xff0c;能够监测超过20万项指标。这些指标涵盖了从硬件设备到软件系统&#xff0c;从网络性能到安全状态等各个方面。如下基于美信监控易——IT基础监控模块&#xff0c;对华为E9000刀箱服务器部分监控指标进行解读。 一、华为E9000…

自动化标注平台开源,基于 yolov8标注平台可本地部署

yolov8标注平台本地部署&#xff08;docker部署&#xff09;&#xff0c;已调通yolov8模型自动预标注功能。 下面开始背景知识…… 1&#xff09;数据标注为什么在人工智能时代如此重要&#xff1f; 数据标注在人工智能时代如此重要&#xff0c;原因如下&#xff1a; 为机器…

PyTorch使用教程(6)一文讲清楚torch.nn和torch.nn.functional的区别

torch.nn 和 torch.nn.functional 在 PyTorch 中都是用于构建神经网络的重要组件&#xff0c;但它们在设计理念、使用方式和功能上存在一些显著的区别。以下是关于这两个模块的详细区别&#xff1a; 1. 继承方式与结构 torch.nn torch.nn 中的模块大多数是通过继承 torch.nn…

海思Hi3516CV610 -----芯片说明

Hi3516CV610这颗超高清智慧视觉SoC芯片是由海思技术有限公司推出的&#xff0c;其首发量产的时间是在2024年4。标志着海思正式回归安防市场&#xff0c;并在IPC SoC市场中展开竞争。 关键特性 ●4K20&#xff0c;6M30分辨率 ●双目实时接入&#xff0c;支撑枪球一体机等双目机…

iOS-支付相关

支付宝支付 #import <AlipaySDK/AlipaySDK.h> //orderStrAliPay为服务端传的订单信息 //fromScheme为应用配置的schemeUrl标识&#xff0c;用户支付包支付成功后跳转会本应用内 //callback回调需要在- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url 中调…

go读取excel游戏配置

1.背景 游戏服务器&#xff0c;配置数据一般采用csv/excel来作为载体&#xff0c;这种方式&#xff0c;策划同学配置方便&#xff0c;服务器解析也方便。在jforgame框架里&#xff0c;我们使用以下的excel配置格式。 然后可以非常方便的进行数据检索&#xff0c;例如&#xff…

热点营销新视角:品牌如何巧妙“跟风”不踩雷?

在当今信息爆炸的时代&#xff0c;热点事件如同流星划过夜空&#xff0c;转瞬即逝&#xff0c;却总能吸引无数眼球。而软文营销作为品牌推广的重要手段之一&#xff0c;如何巧妙“跟风”热点&#xff0c;既能借势提升品牌曝光度&#xff0c;又能避免陷入雷区&#xff0c;成为众…

Trimble三维激光扫描-地下公共设施维护的新途径【沪敖3D】

三维激光扫描技术生成了复杂隧道网络的高度详细的三维模型 项目背景 纽约州北部的地下通道网络已有100年历史&#xff0c;其中包含供暖系统、电线和其他公用设施&#xff0c;现在已经开始显露出老化迹象。由于安全原因&#xff0c;第三方的进入受到限制&#xff0c;在没有现成纸…

TDengine 做 Apache SuperSet 数据源

‌Apache Superset‌ 是一个现代的企业级商业智能&#xff08;BI&#xff09;Web 应用程序&#xff0c;主要用于数据探索和可视化。它由 Apache 软件基金会支持&#xff0c;是一个开源项目&#xff0c;它拥有活跃的社区和丰富的生态系统。Apache Superset 提供了直观的用户界面…

K8S-Pod的环境变量,重启策略,数据持久化,资源限制

1. Pod容器的三种重启策略 注意&#xff1a;k8s所谓的重启容器指的是重新创建容器 cat 07-restartPolicy.yaml apiVersion: v1 kind: Pod metadata:name: nginx-web-imagepullpolicy-always spec:nodeName: k8s233.oldboyedu.com## 当容器异常退出时&#xff0c;始终重启容器r…

03垃圾回收篇(D1_垃圾收集器算法底层导论)

目录 一、为什么我们要去了解垃圾收集和内存分配 二、对象已死&#xff1f; 1. 引用计数算法 2. 可达性分析算法 3. 再谈引用 4. 生存还是死亡 5. 回收方法区 三、垃圾收集算法 1. 简介 2. 分代收集理论 2.1. 弱分代/强分代假说 2.2. 前面两代假说的缺陷 3. 标记-清…