SparkSQL综合案例-省份维度的销售情况统计分析

news2024/11/24 7:29:45

一、项目背景

二、项目需求

        (1)需求

        ①各省销售指标,每个省份的销售额统计

        ②TOP3销售省份中,有多少家店铺日均销售额1000+

        ③TOP3省份中,各个省份的平均单价

        ④TOP3省份中,各个省份的支付类型比例

        (2)要求

        ①将需求结果写出到mysql

        ②将数据写入到Spark On Hive中

三、代码实现

        (1)需求1:
# cording:utf8
'''
要求1:各省销售额统计
要求2:TOP3销售省份中,有多少店铺达到过日销售额1000+
要求3:TOP3省份中,各省的平均单单价
要求4:TOP3省份中,各个省份的支付类型比例
'''

from pyspark.sql import SparkSession
from pyspark.sql import functions as F
if __name__ == '__main__':
    spark = SparkSession.builder.appName('SQL_text').\
        master('local[*]').\
        config('spark.sql.shuffle.partitions', '2').\
        config('spark.sql.warehouse.dir', 'hdfs://pyspark01/user/hive/warehouse').\
        config('hive.metastore.uris', 'thrift://pyspark01:9083').\
        enableHiveSupport().\
        getOrCreate()
    # 1.读取数据
    # 省份信息,缺失值过滤,同时省份信息中会有‘null’字符串
    # 订单的金额,数据集中有订单的金额是单笔超过10000的,这些事测试数据
    # 列值过滤(SparkSQL会自动做这个优化)
    df = spark.read.format('json').load('../../input/mini.json').\
        dropna(thresh=1, subset=['storeProvince']).\
        filter("storeProvince != 'null'").\
        filter('receivable < 10000').\
        select('storeProvince', 'storeID', 'receivable', 'dateTS', 'payType')

    # TODO 1:各省销售额统计
    province_sale_df = df.groupBy('storeProvince').sum('receivable').\
        withColumnRenamed('sum(receivable)', 'money').\
        withColumn('money', F.round('money', 2)).\
        orderBy('money', ascending=False)
    province_sale_df.show(truncate=False)

    # 写出到Mysql
    province_sale_df.write.mode('overwrite').\
        format('jdbc').\
        option('url', 'jdbc:mysql://pyspark01:3306/bigdata?useSSL=False&useUnicode=true&characterEncoding=utf8').\
        option('dbtable', 'province_sale').\
        option('user', 'root').\
        option('password', 'root').\
        option('encoding', 'utf8').\
        save()

    # 写出Hive表 saveAsTable 可以写出表 要求已经配置好spark on hive
    # 会将表写入到hive的数据仓库中
    province_sale_df.write.mode('overwrite').saveAsTable('default.province_sale', 'parquet')

        结果展示:

        MySQL数据展示:

        Hive数据展示:

        (2)需求2:
# cording:utf8
'''
要求1:各省销售额统计
要求2:TOP3销售省份中,有多少店铺达到过日销售额1000+
要求3:TOP3省份中,各省的平均单单价
要求4:TOP3省份中,各个省份的支付类型比例
'''

from pyspark.sql import SparkSession
from pyspark.sql import functions as F
from pyspark.storagelevel import StorageLevel

if __name__ == '__main__':
    spark = SparkSession.builder.appName('SQL_text').\
        master('local[*]').\
        config('spark.sql.shuffle.partitions', '2').\
        config('spark.sql.warehouse.dir', 'hdfs://pyspark01/user/hive/warehouse').\
        config('hive.metastore.uris', 'thrift://pyspark01:9083').\
        enableHiveSupport().\
        getOrCreate()
    # 1.读取数据
    # 省份信息,缺失值过滤,同时省份信息中会有‘null’字符串
    # 订单的金额,数据集中有订单的金额是单笔超过10000的,这些事测试数据
    # 列值过滤(SparkSQL会自动做这个优化)
    df = spark.read.format('json').load('../../input/mini.json').\
        dropna(thresh=1, subset=['storeProvince']).\
        filter("storeProvince != 'null'").\
        filter('receivable < 10000').\
        select('storeProvince', 'storeID', 'receivable', 'dateTS', 'payType')

    # TODO 1:各省销售额统计
    province_sale_df = df.groupBy('storeProvince').sum('receivable').\
        withColumnRenamed('sum(receivable)', 'money').\
        withColumn('money', F.round('money', 2)).\
        orderBy('money', ascending=False)
    # # 写出到Mysql
    # province_sale_df.write.mode('overwrite').\
    #     format('jdbc').\
    #     option('url', 'jdbc:mysql://pyspark01:3306/bigdata?useSSL=False&useUnicode=true&characterEncoding=utf8').\
    #     option('dbtable', 'province_sale').\
    #     option('user', 'root').\
    #     option('password', 'root').\
    #     option('encoding', 'utf8').\
    #     save()
    #
    # # 写出Hive表 saveAsTable 可以写出表 要求已经配置好spark on hive
    # # 会将表写入到hive的数据仓库中
    # province_sale_df.write.mode('overwrite').saveAsTable('default.province_sale', 'parquet')

    # TODO 需求2:TOP3销售省份中,有多少店铺达到过日销售额1000+
    # 2.1 找到TOP3的销售省份
    top3_province_df = province_sale_df.limit(3).select('storeProvince').\
        withColumnRenamed('storeProvince', 'top3_province')     # 对列名进行重命名,防止与province_sale_df的storeProvince冲突

    # 2.2 和原始的DF进行内关联,数据关联后,得到TOP3省份的销售数据
    top3_province_df_joined = df.join(top3_province_df, on=df['storeProvince'] == top3_province_df['top3_province'])

    # 因为需要多次使用到TOP3省份数据,所有对其进行持久化缓存
    top3_province_df_joined.persist(StorageLevel.MEMORY_AND_DISK)

    # from_unixtime将秒级的日期数据转换为年月日数据
    # from_unixtime的精度是秒级,数据的精度是毫秒级,需要对数据进行进度的裁剪
    province_hot_store_count_df = top3_province_df_joined.groupBy("storeProvince", "storeID",
                        F.from_unixtime(df['dateTS'].substr(0, 10), "yyyy-mm-dd").alias('day')).\
                        sum('receivable').withColumnRenamed('sum(receivable)', 'money').\
                         filter('money > 1000 ').\
                        dropDuplicates(subset=['storeID']).\
                        groupBy('storeProvince').count()
    province_hot_store_count_df.show()
    # 写出到Mysql
    province_sale_df.write.mode('overwrite'). \
        format('jdbc'). \
        option('url', 'jdbc:mysql://pyspark01:3306/bigdata?useSSL=False&useUnicode=true&characterEncoding=utf8'). \
        option('dbtable', 'province_hot_store_count'). \
        option('user', 'root'). \
        option('password', 'root'). \
        option('encoding', 'utf8'). \
        save()

    # 写出Hive表 saveAsTable 可以写出表 要求已经配置好spark on hive
    # 会将表写入到hive的数据仓库中
    province_sale_df.write.mode('overwrite').saveAsTable('default.province_hot_store_count', 'parquet')

    top3_province_df_joined.unpersist()

        结果展示:

        MySQL结果展示:

        Hive结果展示:

        (3)需求3:
# cording:utf8
'''
要求1:各省销售额统计
要求2:TOP3销售省份中,有多少店铺达到过日销售额1000+
要求3:TOP3省份中,各省的平均单单价
要求4:TOP3省份中,各个省份的支付类型比例
'''

from pyspark.sql import SparkSession
from pyspark.sql import functions as F
from pyspark.storagelevel import StorageLevel

if __name__ == '__main__':
    spark = SparkSession.builder.appName('SQL_text').\
        master('local[*]').\
        config('spark.sql.shuffle.partitions', '2').\
        config('spark.sql.warehouse.dir', 'hdfs://pyspark01/user/hive/warehouse').\
        config('hive.metastore.uris', 'thrift://pyspark01:9083').\
        enableHiveSupport().\
        getOrCreate()
    # 1.读取数据
    # 省份信息,缺失值过滤,同时省份信息中会有‘null’字符串
    # 订单的金额,数据集中有订单的金额是单笔超过10000的,这些事测试数据
    # 列值过滤(SparkSQL会自动做这个优化)
    df = spark.read.format('json').load('../../input/mini.json').\
        dropna(thresh=1, subset=['storeProvince']).\
        filter("storeProvince != 'null'").\
        filter('receivable < 10000').\
        select('storeProvince', 'storeID', 'receivable', 'dateTS', 'payType')

    # TODO 1:各省销售额统计
    province_sale_df = df.groupBy('storeProvince').sum('receivable').\
        withColumnRenamed('sum(receivable)', 'money').\
        withColumn('money', F.round('money', 2)).\
        orderBy('money', ascending=False)
    # # 写出到Mysql
    # province_sale_df.write.mode('overwrite').\
    #     format('jdbc').\
    #     option('url', 'jdbc:mysql://pyspark01:3306/bigdata?useSSL=False&useUnicode=true&characterEncoding=utf8').\
    #     option('dbtable', 'province_sale').\
    #     option('user', 'root').\
    #     option('password', 'root').\
    #     option('encoding', 'utf8').\
    #     save()
    #
    # # 写出Hive表 saveAsTable 可以写出表 要求已经配置好spark on hive
    # # 会将表写入到hive的数据仓库中
    # province_sale_df.write.mode('overwrite').saveAsTable('default.province_sale', 'parquet')

    # TODO 需求2:TOP3销售省份中,有多少店铺达到过日销售额1000+
    # 2.1 找到TOP3的销售省份
    top3_province_df = province_sale_df.limit(3).select('storeProvince').\
        withColumnRenamed('storeProvince', 'top3_province')     # 对列名进行重命名,防止与province_sale_df的storeProvince冲突

    # 2.2 和原始的DF进行内关联,数据关联后,得到TOP3省份的销售数据
    top3_province_df_joined = df.join(top3_province_df, on=df['storeProvince'] == top3_province_df['top3_province'])

    # 因为需要多次使用到TOP3省份数据,所有对其进行持久化缓存
    top3_province_df_joined.persist(StorageLevel.MEMORY_AND_DISK)

    # from_unixtime将秒级的日期数据转换为年月日数据
    # from_unixtime的精度是秒级,数据的精度是毫秒级,需要对数据进行进度的裁剪
    province_hot_store_count_df = top3_province_df_joined.groupBy("storeProvince", "storeID",
                        F.from_unixtime(df['dateTS'].substr(0, 10), "yyyy-mm-dd").alias('day')).\
                        sum('receivable').withColumnRenamed('sum(receivable)', 'money').\
                         filter('money > 1000 ').\
                        dropDuplicates(subset=['storeID']).\
                        groupBy('storeProvince').count()
    province_hot_store_count_df.show()
    # # 写出到Mysql
    # province_hot_store_count_df.write.mode('overwrite'). \
    #     format('jdbc'). \
    #     option('url', 'jdbc:mysql://pyspark01:3306/bigdata?useSSL=False&useUnicode=true&characterEncoding=utf8'). \
    #     option('dbtable', 'province_hot_store_count'). \
    #     option('user', 'root'). \
    #     option('password', 'root'). \
    #     option('encoding', 'utf8'). \
    #     save()
    #
    # # 写出Hive表 saveAsTable 可以写出表 要求已经配置好spark on hive
    # # 会将表写入到hive的数据仓库中
    # province_hot_store_count_df.write.mode('overwrite').saveAsTable('default.province_hot_store_count', 'parquet')


    # TODO 3:TOP3省份中,各省的平均单单价
    top3_province_order_avg_df = top3_province_df_joined.groupBy("storeProvince").\
        avg("receivable").\
        withColumnRenamed("avg(receivable)", "money").\
        withColumn("money", F.round("money", 2)).\
        orderBy("money", ascending=False)
    top3_province_order_avg_df.show(truncate=False)

    # 写出到Mysql
    top3_province_order_avg_df.write.mode('overwrite'). \
        format('jdbc'). \
        option('url', 'jdbc:mysql://pyspark01:3306/bigdata?useSSL=False&useUnicode=true&characterEncoding=utf8'). \
        option('dbtable', 'top3_province_order_avg'). \
        option('user', 'root'). \
        option('password', 'root'). \
        option('encoding', 'utf8'). \
        save()

    # 写出Hive表 saveAsTable 可以写出表 要求已经配置好spark on hive
    # 会将表写入到hive的数据仓库中
    top3_province_order_avg_df.write.mode('overwrite').saveAsTable('default.top3_province_order_avg', 'parquet')

    top3_province_df_joined.unpersist()

        结果展示

        MySQL与Hive结果展示:

        (4)需求4:
# cording:utf8
'''
要求1:各省销售额统计
要求2:TOP3销售省份中,有多少店铺达到过日销售额1000+
要求3:TOP3省份中,各省的平均单单价
要求4:TOP3省份中,各个省份的支付类型比例
'''

from pyspark.sql import SparkSession
from pyspark.sql import functions as F
from pyspark.storagelevel import StorageLevel
from pyspark.sql.types import StringType
if __name__ == '__main__':
    spark = SparkSession.builder.appName('SQL_text').\
        master('local[*]').\
        config('spark.sql.shuffle.partitions', '2').\
        config('spark.sql.warehouse.dir', 'hdfs://pyspark01/user/hive/warehouse').\
        config('hive.metastore.uris', 'thrift://pyspark01:9083').\
        enableHiveSupport().\
        getOrCreate()
    # 1.读取数据
    # 省份信息,缺失值过滤,同时省份信息中会有‘null’字符串
    # 订单的金额,数据集中有订单的金额是单笔超过10000的,这些事测试数据
    # 列值过滤(SparkSQL会自动做这个优化)
    df = spark.read.format('json').load('../../input/mini.json').\
        dropna(thresh=1, subset=['storeProvince']).\
        filter("storeProvince != 'null'").\
        filter('receivable < 10000').\
        select('storeProvince', 'storeID', 'receivable', 'dateTS', 'payType')

    # TODO 1:各省销售额统计
    province_sale_df = df.groupBy('storeProvince').sum('receivable').\
        withColumnRenamed('sum(receivable)', 'money').\
        withColumn('money', F.round('money', 2)).\
        orderBy('money', ascending=False)
    # # 写出到Mysql
    # province_sale_df.write.mode('overwrite').\
    #     format('jdbc').\
    #     option('url', 'jdbc:mysql://pyspark01:3306/bigdata?useSSL=False&useUnicode=true&characterEncoding=utf8').\
    #     option('dbtable', 'province_sale').\
    #     option('user', 'root').\
    #     option('password', 'root').\
    #     option('encoding', 'utf8').\
    #     save()
    #
    # # 写出Hive表 saveAsTable 可以写出表 要求已经配置好spark on hive
    # # 会将表写入到hive的数据仓库中
    # province_sale_df.write.mode('overwrite').saveAsTable('default.province_sale', 'parquet')

    # TODO 需求2:TOP3销售省份中,有多少店铺达到过日销售额1000+
    # 2.1 找到TOP3的销售省份
    top3_province_df = province_sale_df.limit(3).select('storeProvince').\
        withColumnRenamed('storeProvince', 'top3_province')     # 对列名进行重命名,防止与province_sale_df的storeProvince冲突

    # 2.2 和原始的DF进行内关联,数据关联后,得到TOP3省份的销售数据
    top3_province_df_joined = df.join(top3_province_df, on=df['storeProvince'] == top3_province_df['top3_province'])

    # 因为需要多次使用到TOP3省份数据,所有对其进行持久化缓存
    top3_province_df_joined.persist(StorageLevel.MEMORY_AND_DISK)

    # from_unixtime将秒级的日期数据转换为年月日数据
    # from_unixtime的精度是秒级,数据的精度是毫秒级,需要对数据进行进度的裁剪
    province_hot_store_count_df = top3_province_df_joined.groupBy("storeProvince", "storeID",
                        F.from_unixtime(df['dateTS'].substr(0, 10), "yyyy-mm-dd").alias('day')).\
                        sum('receivable').withColumnRenamed('sum(receivable)', 'money').\
                         filter('money > 1000 ').\
                        dropDuplicates(subset=['storeID']).\
                        groupBy('storeProvince').count()
    province_hot_store_count_df.show()
    # # 写出到Mysql
    # province_hot_store_count_df.write.mode('overwrite'). \
    #     format('jdbc'). \
    #     option('url', 'jdbc:mysql://pyspark01:3306/bigdata?useSSL=False&useUnicode=true&characterEncoding=utf8'). \
    #     option('dbtable', 'province_hot_store_count'). \
    #     option('user', 'root'). \
    #     option('password', 'root'). \
    #     option('encoding', 'utf8'). \
    #     save()
    #
    # # 写出Hive表 saveAsTable 可以写出表 要求已经配置好spark on hive
    # # 会将表写入到hive的数据仓库中
    # province_hot_store_count_df.write.mode('overwrite').saveAsTable('default.province_hot_store_count', 'parquet')


    # TODO 3:TOP3省份中,各省的平均单单价
    top3_province_order_avg_df = top3_province_df_joined.groupBy("storeProvince").\
        avg("receivable").\
        withColumnRenamed("avg(receivable)", "money").\
        withColumn("money", F.round("money", 2)).\
        orderBy("money", ascending=False)
    top3_province_order_avg_df.show(truncate=False)

    # # 写出到Mysql
    # top3_province_order_avg_df.write.mode('overwrite'). \
    #     format('jdbc'). \
    #     option('url', 'jdbc:mysql://pyspark01:3306/bigdata?useSSL=False&useUnicode=true&characterEncoding=utf8'). \
    #     option('dbtable', 'top3_province_order_avg'). \
    #     option('user', 'root'). \
    #     option('password', 'root'). \
    #     option('encoding', 'utf8'). \
    #     save()
    #
    # # 写出Hive表 saveAsTable 可以写出表 要求已经配置好spark on hive
    # # 会将表写入到hive的数据仓库中
    # top3_province_order_avg_df.write.mode('overwrite').saveAsTable('default.top3_province_order_avg', 'parquet')

    # TODO 4:TOP3省份中,各个省份的支付类型比例
    top3_province_df_joined.createTempView("province_pay")

    # 自定义UDF
    def udf_func(percent):
        return str(round(percent * 100)) + "%"
    # 注册UDF
    my_udf = F.udf(udf_func, StringType())

    pay_type_df = spark.sql('''
        SELECT storeProvince, payType, (count(payType) / total) AS percent FROM 
        (SELECT storeProvince, payType, count(1) OVER(PARTITION BY storeProvince) AS total FROM province_pay) AS sub
        GROUP BY storeProvince, payType, total
    ''').withColumn('percent', my_udf("percent"))
    pay_type_df.show()

    # 写出到Mysql
    pay_type_df.write.mode('overwrite'). \
        format('jdbc'). \
        option('url', 'jdbc:mysql://pyspark01:3306/bigdata?useSSL=False&useUnicode=true&characterEncoding=utf8'). \
        option('dbtable', 'pay_type'). \
        option('user', 'root'). \
        option('password', 'root'). \
        option('encoding', 'utf8'). \
        save()

    # 写出Hive表 saveAsTable 可以写出表 要求已经配置好spark on hive
    # 会将表写入到hive的数据仓库中
    top3_province_order_avg_df.write.mode('overwrite').saveAsTable('default.pay_type', 'parquet')

    top3_province_df_joined.unpersist()

       结果展示:

       MySQL结果展示:

        Hive结果展示:

四、项目运行问题及解决方法

        报错:java.sql.BatchUpdateException: Incorrect string value: '\xE6\xB1\x9F\xE8\xA5\xBF...' for column 'storeProvince' atrow1

        原因:MySQL的UTF-8只支持3个字节的unicode字符,无法支持四个字节的Unicode字符

        解决办法:在MySQL控制台执行下列代码修改编码格式

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于jquery+html开发的json格式校验工具

json简介 JSON是一种轻量级的数据交换格式。 易于人阅读和编写。同时也易于机器解析和生成。 它基于JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999的一个子集。 JSON采用完全独立于语言的文本格式&#xff0c;但是也使用了类似于C语言家族…

打破信息孤岛,如何从API、数据中台突围

“烟囱”林立&#xff0c;零售企业“数据孤岛”现象突出 所谓数据孤岛&#xff0c;是指零售企业不同组织机构之间、不同部门之间或不同软件之间的数据无法连接互动&#xff0c;数据信息不能共享&#xff0c;设计、管理、生产的数据不能相互交流&#xff0c;数据出现脱节的现象…

tomcat必要的配置

tomcat要配置两个&#xff0c;不然访问不了localhost:8080 名&#xff1a;CATALINA_HOME 值&#xff1a;D:\software\computer_software\Tomcat\tomcat8.5.66

C/C++版数据结构和算法知识概要

数据结构和算法是计算机科学领域中的重要基础知识&#xff0c;无论您是初学者还是有经验的程序员&#xff0c;都必须深入了解这些概念。本篇博客将为您提供关于数据结构、抽象数据类型、算法、算法分析以及面向对象编程的综合概述&#xff0c;每个部分都将附有具体的代码示例。…

技术栈 业务架构 插件库

大前端 技术栈 业务架构 插件库

软考高项-计算题(3)

题10 问题一 EV50*0.525 问题二 EACBAC/CPI CPIEV/AC25/28 EAC50*28/2556 问题三 因为CPI<1&#xff0c;所以项目实际费用超支 题11 PV2000500010000750006500020000177000 AC2100450012000860006000015000179600 EV200050001000075000*0.965000*0.720000*0.351370…

vite的.env个人使用总结

以.env开头,后面是自定义环境,如gaga 配置文件内以VITE_开头 使用时,用--mode指定模式 在react中用import.meta.env为前缀获取对应值 在配置文件中使用方法:需要从vite中导入loadEnv包,再将defineConfig改成函数,返回对象. const env loadEnv(mode.mode, process.cwd());这一…

CCF CSP认证历年题目自练 Day40

题目 试题编号&#xff1a; 201412-3 试题名称&#xff1a; 集合竞价 时间限制&#xff1a; 1.0s 内存限制&#xff1a; 256.0MB 问题描述&#xff1a; 问题描述   某股票交易所请你编写一个程序&#xff0c;根据开盘前客户提交的订单来确定某特定股票的开盘价和开盘成交量…

Csdn文章编写参考案例

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…

【javaweb】学习日记Day12 - tlias智能管理系统 - 登录校验 JWT令牌 过滤器 拦截器 全局异常处理

目录 一、登录功能 &#xff08;1&#xff09;Controller层 &#xff08;2&#xff09;Service层 &#xff08;3&#xff09;Mapper层 二、登录校验 1、会话技术概述 2、会话跟踪方案 &#xff08;1&#xff09;Cookie &#xff08;2&#xff09;Session —— 基于Co…

kaggle新赛:AI Village夺旗赛挑战

赛题名称&#xff1a;AI Village Capture the Flag DEFCON31 赛题链接&#xff1a;https://www.kaggle.com/competitions/ai-village-capture-the-flag-defcon31 赛题背景 夺旗赛这款广受欢迎的竞技游戏&#xff0c;不仅可以在户外进行。数字夺旗赛指的是一系列需要参赛者利…

python操作MySQL,SQL注入问题,视图,触发器,事务,存储过程,内置函数,流程控制,索引

一、python操作MySQL 导入第三方模块&#xff1a;pymysql 操作步骤&#xff08;文字描述&#xff09;&#xff1a; 1. 先链接MySQL host&#xff0c;port&#xff0c;username&#xff0c;password&#xff0c;charset&#xff0c;库&#xff0c;autocommit等 2. 在python中书…

06条件判断

if语句的基本语法 if关键字后面跟一个判断条件 如果条件成立那么就运行判断条件里面的代码 else处理条件不满足时候的代码块 m 9 if m > 10:print("买一瓶醋") else:print("钱不够&#xff0c;请带够钱再来吧&#xff01;")#条件判断流程图 进入网…

stream流—关于Collectors.toMap使用详解

目录 使用规则&#xff1a;1.将list转成以id为key的map&#xff0c;value是id对应的某对象2.假如id存在重复值&#xff0c;则会报错Duplicate key xxx3.想获得一个id和name对应的Map<String, String>3.1 name为空时null3.2 id重复时 4.分组 使用groupingby 使用规则&…

系列二十五、@Configuration的作用及解析原理

一、作用 Configuration是用来代替传统的xml的配置方式配置bean的。 二、不加Configuration注解不能配置bean吗 能。 三、加与不加的区别 3.1、区别 加了Configuration注解&#xff0c;会为配置类创建cglib动态代理&#xff0c;Bean方法的调用就会通过容器getBean进行获取…

面试准备中........

一、Linux 计算机网络相关&#xff1a; 1.OSI七层模型 应用层 &#xff1a;给用户提供操作界面 表示层&#xff1a;数据的表示&#xff1a;将字符转化为2进制或将2进制转化为字符。加密&#xff1a;对称加密和非对称加密&#xff0c;ssh协议。压缩&#xff1a;将文件压缩。…

C# 图解教程 第5版 —— 第12章 枚举

文章目录 12.1 枚举12.1.1 设置底层类型和显式值12.1.2 隐式成员编号 12.2 位标志12.2.1 Flags 特性12.2.2 使用位标志的示例&#xff08;*&#xff09; 12.3 关于枚举的更多内容 12.1 枚举 枚举是值类型。只有一种类型的成员&#xff1a;命名的整数值常量。 每个枚举成员都被…

VS工程的“多dll与exe文件合并”

运行环境 ILMerge插件 1、打开 VS的“工具 - NuGet包管理器 - 管理解决方案的NuGet程序包” 2、在浏览中搜索“ILMerge”&#xff0c;在官方源中&#xff0c;3.0.41版本的插件已不支持使用了 3、下拉列表其他版本可以安装&#xff0c;使用3.0.40 4、下载封装好的“ILMerge”任…

Kotlin基础——变量、函数、字符串模板、类

变量 Kotlin和Java一样是静态语言&#xff0c;所有表达式类型在编译期已经确定&#xff0c;public为默认可见性 变量由 var/val变量名[: 数据类型][?][ 值] 组成&#xff0c;如 var a 1var b: Int b 3var s: String? nullval language arrayListOf("java")…

Kmeans算法的K值选择技巧【Elbow Method + Silhouette Score Method】

文章目录 一、方法简述二、使用到的数据集三、代码实现四、结论 一、方法简述 在Kmeans算法中最终聚类数量K的选择主要通过两个方法综合判断&#xff1a; Elbow Method 这是一种绘制k值范围的平方和的方法。如果此图看起来像一只手臂&#xff0c;则k是选择的类似肘部的值。从这…