当前位置: 首页 > news >正文

Spark大数据分析案例(pycharm)

所需文件(将文件放在路径下,自己记住后面要用):

通过百度网盘分享的文件:beauty_p....csv等4个文件
链接:https://pan.baidu.com/s/1pBAus1yRgefveOc7NXRD-g?pwd=22dj 
提取码:22dj 
复制这段内容打开「百度网盘APP 即可获取」

工具:Spark下安装的pycharm

5.20
2.窗口操作(Spark SQL)
在处理数据时,经常会遇到数据的分类问题,比如“按照性别,统计班级的男生和女生的 数量”,这种
问题通过SQL语句的GROUP BY和聚合函数就可以解决,比如“SELECT gender, count(‘gender’) AS 
stu_count FROM stu GROUP BY gender”。不过有时候我们关注的并不是分组统计问题,而是类似“有来
自多个班的学生成绩,分别对每个班的学生进行成绩排名”这样的问题,不是对所有班的学生进行排
名,而是针对每个班的学生进行单独的排名
显然,首先这是一个分组问题,但不能通过GROUP BY来解决。也就是说,这里的分组是一个大前提,
分组之后再对单独每一组的数据进行排序,Spark SQL实现的一个高级特性,即“窗口函数”或“开窗操
作”正是针对这类问题的

2.窗口操作(Spark SQL)
那么什么是窗口函数呢?实际上,窗口可以理解为“指定记录的集合”,即每条记录都有其对应的窗口,
窗口的功能与GROUP BY类似,它们都能将满足条件的记录划分出来。所谓窗口函数,就是对窗口中的
记录(满足某种条件的记录集合)进行执行的一类特殊函数。窗口函数和普通SQL聚合函数的区别主要
有如下3点
(1)聚合函数是将多条记录聚合运算为一条,代表的是一个数据的汇总过程,而窗口函数是对每条
记录在对应的窗口内进行运算,不会改变记录的条数
(2)当窗口函数和聚合函数一起使用时,窗口函数是基于聚合后的数据执行的,也就是说,先执行
聚合操作,再执行窗口函数
(3)窗口函数的执行是在SQL中的FROM、JOIN、WHERE、GROUP BY、HAVING之后,且在ORDER
BY、LIMIT、SELECT、DISTINCT之前完成。当窗口函数执行时,因为GROUP BY的聚合过程已经结束,
所以不会再产生数据的聚合操作


一、启动PyCharm集成开发环境
在Ubuntu 20.04的应用程序列表中找到这个图标启动PyCharm集成开发环境,选择New Project…命令创建一个新的Python项目
名字为BeautyProduct
编译器为python3.6
位置(主要看自己的位置):/home/spark/PycharmProjects/BeautyProduct(文件名)

main.py编写代码(删除原有的配置)
#导入库模块
from pyspark.sql import SparkSession
from pyspark.sql.functions import regexp_replace,col,lit
from pyspark.sql import functions as F

#创建Spark对象
spark = SparkSession.builder.appName('SparkBeautyProduct').getOrCreate()
sc = spark.sparkContext

#创建两个df
# 从csv文件读取数据,header代表标题行,inferSchema代表是否自动推断字段类型
df1 = spark.read.csv('hdfs://localhost:9000/datas/beauty_prod_info.csv',
    encoding='UTF-8', header=True, sep=',', inferSchema=False,
    #商品编号prod_id,商品名称product,商品小类cataB,商品大类cataA,销售单价price
    schema='prod_id string, product string, cataB string, cataA string, price float')
df2 = spark.read.csv('hdfs://localhost:9000/datas/beauty_prod_sales.csv',
    encoding='UTF-8', header=True, sep=',', inferSchema=False,
    #订单编码order_id,订单日期od_date,客户编码cust_id,所在区域cust_region,
    #所在省份cust_province,所在地市cust_city,商品编号prod_id,
    #订购数量od_quantity,订购单价od_price,金额od_amount
    schema='''order_id string, od_date string, cust_id string,
              cust_region string, cust_province string, cust_city string,
              prod_id string, od_quantity string, od_price string, od_amount float''')


启动HDFS

spark@vm01:~$ start-all.sh
spark@vm01:~$ jps
3216 SecondaryNameNode
3793 Jps
3346 ResourceManager
1860 Main
3481 NodeManager
3020 DataNode
2846 NameNode

订单数据处理分析
美妆商品订单数据存储在CSV文件中,它们都是结构化的数据,Spark SQL要做的工作包括数据清洗和数据预处理两个方面。为了将数据文件存放到HDFS文件系统上,要先确保HDFS服务已经在运行,然后在HDFS上创建一个datas文件夹,并将两个CSV文件上传至datas文件夹中

将数据文件传送到hdfs里的datas文件夹里
spark@vm01:~$ hdfs dfs -mkdir -p /datas
spark@vm01:~$ hdfs dfs -ls
Found 1 items
drwxr-xr-x   - spark supergroup          0 2025-05-06 22:25 .sparkStaging
spark@vm01:~$ hdfs dfs -ls /datas
spark@vm01:~$ hdfs dfs -put ~/mydata/beauty/beauty_prod_*.csv /datas
spark@vm01:~$ hdfs dfs -ls /datas
Found 2 items
-rw-r--r--   1 spark supergroup       4462 2025-05-19 22:52 /datas/beauty_prod_info.csv
-rw-r--r--   1 spark supergroup    2281550 2025-05-19 22:52 /datas/beauty_prod_sales.csv

使用Spark SQL把CSV文件转换成DataFrame对象,重新设定Schema的字段信息,一是为数据清洗做准
备,二是尽量避免在SQL语句中硬编码中文的字段名称。接着在PyCharm的main.py已有代码之后输入
下面的代码

# 数据清洗:删除包含空字段的数据行、商品编号相同的数据行
df_prod_info = df1.dropna() \
                  .dropDuplicates(['prod_id'])
# 数据清洗:处理订单日期、订购数量、订购单价字段的非法字符,过滤包含错误日期的订单
# 新增一个od_month字段代表订单月份,在后面统计使用
df_prod_sales = df2 \
    .dropna() \
    .distinct() \
    .withColumn("od_date", regexp_replace('od_date', '#', '-')) \
    .withColumn("od_quantity", regexp_replace('od_quantity','个','')) \
    .withColumn("od_price", regexp_replace('od_price','元','')) \
    .withColumn('cust_province', regexp_replace('cust_province','自治区|维吾尔|回族|壮族|省|市','')) \
    .withColumn("od_date", col('od_date').cast('date')) \
    .withColumn("od_quantity", col('od_quantity').cast('integer')) \
    .withColumn("od_price", col('od_price').cast('float')) \
    .withColumn("od_month", F.month('od_date')) \
    .filter("od_date<'2025-12-31'")          #日期改为今年年底

df1.show(10)
df2.show(10)

运行结果:
+-------+-------+-----+------+-----+
|prod_id|product|cataB| cataA|price|
+-------+-------+-----+------+-----+
|   X001|  商品1| 面膜|护肤品|121.0|
|   X002|  商品2| 面膜|护肤品|141.0|
|   X003|  商品3| 面膜|护肤品|168.0|
|   X004|  商品4| 面膜|护肤品|211.0|
|   X005|  商品5| 面膜|护肤品|185.0|
|   X006|  商品6| 面膜|护肤品|159.0|
|   X007|  商品7| 面膜|护肤品|213.0|
|   X008|  商品8| 面膜|护肤品|119.0|
|   X009|  商品9| 面膜|护肤品| 92.0|
|   X010| 商品10| 面膜|护肤品| 58.0|
+-------+-------+-----+------+-----+

+--------+---------+-------+-----------+--------------+--------------------+-------+-----------+--------+---------+
|order_id|  od_date|cust_id|cust_region| cust_province|           cust_city|prod_id|od_quantity|od_price|od_amount|
+--------+---------+-------+-----------+--------------+--------------------+-------+-----------+--------+---------+
|  D31313|2019-5-16| S22796|       东区|        浙江省|              台州市|   X091|        892|     214| 190888.0|
|  D21329|2019-5-14| S11460|       东区|        安徽省|              宿州市|   X005|        276|     185|  51060.0|
|  D22372|2019-8-26| S11101|       北区|        山西省|              忻州市|   X078|       1450|     116| 168200.0|
|  D31078| 2019-4-8| S10902|       北区|        吉林省|    延边朝鲜族自治州|   X025|       1834|     102| 187068.0|
|  D32470|2019-4-11| S18696|       北区|        北京市|              北京市|   X010|        887|      58|  51446.0|
|  D28336| 2019-2-8| S17681|       西区|        云南省|红河哈尼族彝族自治州|   X039|       1102|     108| 119016.0|
|  D29820|2019#3#11| S13780|       南区|        广东省|              江门市|   X011|       1180|     226| 266680.0|
|  D31449| 2019-5-1| S12455|       南区|广西壮族自治区|              百色市|   X051|       1236|     203| 250908.0|
|  D22542|2019-9-18| S10865|       北区|  内蒙古自治区|          呼和浩特市|   X089|       1101|     104| 114504.0|
|  D31859|2019-1-17| S17785|       西区|        云南省|              曲靖市|   X001|        235|     121|  28435.0|
+--------+---------+-------+-----------+--------------+--------------------+-------+-----------+--------+---------+

#1.统计每个“商品小类”中价格最高的前5个商品
df_top5_product = spark.sql(
    'SELECT *,dense_rank() over (partition by cataB order by price DESC) as rank FROM prod')\
    .where('rank<=5')
df_top5_product.show()

结果:
+-------+-------+------+------+-----+----+
|prod_id|product| cataB| cataA|price|rank|
+-------+-------+------+------+-----+----+
|   X071| 商品71|防晒霜|护肤品|253.0|   1|
|   X069| 商品69|防晒霜|护肤品|251.0|   2|
|   X070| 商品70|防晒霜|护肤品|242.0|   3|
|   X068| 商品68|防晒霜|护肤品|225.0|   4|
|   X073| 商品73|防晒霜|护肤品|209.0|   5|
|   X062| 商品62|隔离霜|护肤品|239.0|   1|
|   X067| 商品67|隔离霜|护肤品|212.0|   2|
|   X061| 商品61|隔离霜|护肤品|203.0|   3|
|   X063| 商品63|隔离霜|护肤品|162.0|   4|
|   X064| 商品64|隔离霜|护肤品|150.0|   5|
|   X024| 商品24|  眼霜|护肤品|235.0|   1|
|   X023| 商品23|  眼霜|护肤品|235.0|   1|
|   X017| 商品17|  眼霜|护肤品|213.0|   2|
|   X018| 商品18|  眼霜|护肤品|212.0|   3|
|   X019| 商品19|  眼霜|护肤品|210.0|   4|
|   X022| 商品22|  眼霜|护肤品|158.0|   5|
|   X057| 商品57|爽肤水|护肤品|245.0|   1|
|   X058| 商品58|爽肤水|护肤品|239.0|   2|
|   X056| 商品56|爽肤水|护肤品|233.0|   3|
|   X049| 商品49|爽肤水|护肤品|226.0|   4|
+-------+-------+------+------+-----+----+
only showing top 20 rows

#2.统计每月订购情况,数量和金额
df_month_sale = spark.sql(
    '''SELECT od_month, 
              sum(od_quantity) as total_quantity,
              sum(od_amount) as total_amount
       FROM sales 
       GROUP BY od_month 
       ORDER BY od_month''')
#df_month_sale.show()

结果:
+--------+--------------+------------+
|od_month|total_quantity|total_amount|
+--------+--------------+------------+
|       1|       1947407|3.13620183E8|
|       2|       2145102|3.43201847E8|
|       3|       2568902|4.13361291E8|
|       4|       3184543|5.05195997E8|
|       5|       3590871|5.75270541E8|
|       6|       3553759|5.74130121E8|
|       7|       3884817|6.21952477E8|
|       8|       3833576|6.07935472E8|
|       9|       3113495|4.98623384E8|
+--------+--------------+------------+

#3.统计所在地市的订购数量排行TOP20
df_city_sale = spark.sql(
    '''SELECT cust_city, 
              sum(od_quantity) as total_quantity 
       FROM sales
       GROUP BY cust_city 
       ORDER BY total_quantity DESC 
       LIMIT 20''')
#df_city_sale.show()

结果:
+---------+--------------+
|cust_city|total_quantity|
+---------+--------------+
|   上海市|       1125312|
|   苏州市|       1010450|
|   重庆市|        805434|
|   深圳市|        778322|
|   泉州市|        738150|
|   杭州市|        563136|
|   北京市|        561432|
|   广州市|        523038|
|   南通市|        452168|
|   宁波市|        425098|
|   泰州市|        413528|
|   长沙市|        398747|
|   南京市|        395471|
|   无锡市|        381211|
|   常州市|        361425|
|   温州市|        342305|
|   东莞市|        341821|
|   扬州市|        313732|
|   福州市|        275812|
|   南昌市|        275555|
+---------+--------------+

#4.分析什么类型的美妆需求量最大
# df = spark.sql(
#     '''SELECT s.*,
#               product,cataB,cataA, price
#        FROM sales s,prod p
#        WHERE s.prod_id=p.prod_id''')
# df.show()
df_best_seller = spark.sql(
    '''SELECT cataA,cataB,
              sum(od_quantity) as total_quantity 
       FROM sales s,prod p
       WHERE s.prod_id=p.prod_id 
       GROUP BY cataA,cataB
       ORDER BY cataA ASC, total_quantity DESC''')
df_best_seller.show()

结果:
+------+------+--------------+
| cataA| cataB|total_quantity|
+------+------+--------------+
|  彩妆|  口红|       2013024|
|  彩妆|  粉底|       1188621|
|  彩妆|睫毛膏|        586332|
|  彩妆|  眼影|        295795|
|  彩妆|  蜜粉|         45534|
|护肤品|  面膜|       5450216|
|护肤品|  面霜|       4566905|
|护肤品|爽肤水|       3523687|
|护肤品|  眼霜|       3346554|
|护肤品|隔离霜|       2488124|
|护肤品|防晒霜|       2388610|
|护肤品|洁面乳|       1927482|
+------+------+--------------+


Process finished with exit code 0

#5.分析哪些省份的美妆需求量最大
df_province_sale = spark.sql(
    '''SELECT cust_province, 
              sum(od_quantity) as total_quantity 
       FROM sales
       GROUP BY cust_province''')
#df_province_sale.show()

结果:
+-------------+--------------+
|cust_province|total_quantity|
+-------------+--------------+
|         广东|       2951377|
|         云南|        706882|
|       内蒙古|        120813|
|         湖北|        909538|
|         新疆|        202183|
|         海南|        134901|
|         陕西|        647066|
|         天津|        155298|
|         广西|        914145|
|         河南|        552203|
|         贵州|        483007|
|         江苏|       4180558|
|         宁夏|        102254|
|         福建|       1569114|
|       黑龙江|        481754|
|         辽宁|        564647|
|         重庆|        805434|
|         安徽|       1353512|
|         山东|       1234058|
|         湖南|       1314400|
+-------------+--------------+
only showing top 20 rows


Process finished with exit code 0

#6.统计每个客户的最近一次购买时间、消费频率、总消费金额
#增加一个用于SparkSQL窗口操作的字段cust_all设定整列值为1,相当于所有数据在同一个操作窗口中
df = spark.sql(
    '''SELECT cust_id,
              max(od_date) as od_latest,
              count(order_id) as total_count,
              sum(od_amount) as total_amount
       FROM sales
       GROUP BY cust_id''') \
    .withColumn('cust_all', lit(1))
#df.show()

结果:
+-------+----------+-----------+------------+--------+
|cust_id| od_latest|total_count|total_amount|cust_all|
+-------+----------+-----------+------------+--------+
| S14776|2019-09-20|         17|   2596176.0|       1|
| S17873|2019-09-04|         23|   2962041.0|       1|
| S15320|2019-09-20|         55|   8755617.0|       1|
| S22155|2019-08-08|         19|   2446681.0|       1|
| S14412|2019-06-12|         33|   4358357.0|       1|
| S23207|2019-08-23|         19|   2629213.0|       1|
| S19304|2019-09-26|         27|   3698868.0|       1|
| S16573|2019-09-26|         54|   7226044.0|       1|
| S21521|2019-09-24|         34|   5238461.0|       1|
| S19779|2019-09-11|         53|   8737872.0|       1|
| S20992|2019-07-25|         15|   1944612.0|       1|
| S21120|2019-09-27|         16|   1793628.0|       1|
| S12814|2019-09-23|         47|   6543973.0|       1|
| S11602|2019-09-30|         29|   4430713.0|       1|
| S19346|2019-09-26|          9|    997019.0|       1|
| S15443|2019-08-21|         20|   2652965.0|       1|
| S10226|2019-09-23|         17|   2381690.0|       1|
| S23247|2019-07-09|         18|   1935552.0|       1|
| S11773|2019-09-30|         26|   3009549.0|       1|
| S12196|2019-07-29|         10|   1528659.0|       1|
+-------+----------+-----------+------------+--------+
only showing top 20 rows


Process finished with exit code 0

#为生成的客户DataFrame映射为一张临时视图表
df.createOrReplaceTempView('customer')
#通过归一化方式计算 R-Recency  F-Frequency  M-Money 对应的量化值
df = spark.sql(
    '''SELECT cust_id, od_latest,total_count,total_amount,
          percent_rank() over (partition by cust_all order by od_latest) as R,
          percent_rank() over (partition by cust_all order by total_count) as F,
          percent_rank() over (partition by cust_all order by total_amount) as M
       FROM customer''')
#df.show()
#按权重比 R-20% F-30% M-50% 计算客户价值得分,保留1位小数,从大到小排序
df_customerRFM = df\
    .withColumn('score', col('R')*20+col('F')*30+col('M')*50) \
    .withColumn('score', F.round(col('score'),1)) \
    .orderBy(F.desc('score'))
#df_customerRFM.where("score>98").show()

结果:
+-------+----------+-----------+------------+------------------+-----------------+-----------------+-----+
|cust_id| od_latest|total_count|total_amount|                 R|                F|                M|score|
+-------+----------+-----------+------------+------------------+-----------------+-----------------+-----+
| S17476|2019-09-30|         68| 1.0258002E7|0.9602954755309326|0.984302862419206|0.987072945521699| 98.1|
+-------+----------+-----------+------------+------------------+-----------------+-----------------+-----+


#为保存CSV文件准备的中文列名字典
colmap = {'prod_id':'商品编号', 'product':'商品名称',
          'cataB'  :'商品小类', 'cataA'  :'商品大类',
          'price'  :'销售单价',

          'order_id'     :'订单编码','od_date'    :'订单日期',
          'cust_id'      :'客户编码','cust_region':'所在区域',
          'cust_province':'所在省份','cust_city'  :'所在地市',
          'od_quantity'  :'订购数量','od_price'   :'订购单价',
          'od_amount'    :'金额',

          'total_quantity':'订购数量','od_month':'订单月份',
          'total_amount'  :'金额',

          'od_latest'  :'最近一次购买时间',
          'total_count':'消费频率','score':'综合分数',
          }

#每个商品小类中价格最高的前5个商品、每月订购情况、地市订购数量排行
#美妆商品需求量排行、省份美妆需求量排行、RFM模型客户价值
#以上分析结果保存至HDFS存储,便于后续的数据可视化
df_top5_product\
    .drop('rank')\
    .coalesce(1)\
    .withColumnRenamed('prod_id', colmap['prod_id'])\
    .withColumnRenamed('product', colmap['product'])\
    .withColumnRenamed('cataB', colmap['cataB'])\
    .withColumnRenamed('cataA', colmap['cataA'])\
    .withColumnRenamed('price', colmap['price'])\
    .write\
    .option('header', True)\
    .option('sep', ',')\
    .mode('overwrite')\
    .csv('hdfs://localhost:9000/datas/result.top5_product')
df_month_sale.coalesce(1)\
    .withColumnRenamed('od_month', colmap['od_month'])\
    .withColumnRenamed('total_quantity', colmap['total_quantity'])\
    .withColumnRenamed('total_amount', colmap['total_amount'])\
    .write.csv('hdfs://localhost:9000/datas/result.month_sale',
               header=True, mode="overwrite")
df_city_sale.coalesce(1)\
    .withColumnRenamed('cust_city', colmap['cust_city'])\
    .withColumnRenamed('total_quantity', colmap['total_quantity'])\
    .write.csv('hdfs://localhost:9000/datas/result.city_sale',
               header=True, mode="overwrite")
df_best_seller.coalesce(1)\
    .withColumnRenamed('cataA', colmap['cataA'])\
    .withColumnRenamed('cataB', colmap['cataB'])\
    .withColumnRenamed('total_quantity', colmap['total_quantity'])\
    .write.csv('hdfs://localhost:9000/datas/result.best_seller',
               header=True, mode="overwrite")
df_province_sale.coalesce(1)\
    .withColumnRenamed('cust_province', colmap['cust_province'])\
    .withColumnRenamed('total_quantity', colmap['total_quantity'])\
    .write.csv('hdfs://localhost:9000/datas/result.province_sale',
               header=True, mode="overwrite")
df_customerRFM.coalesce(1)\
    .withColumnRenamed('cust_id', colmap['cust_id'])\
    .withColumnRenamed('od_latest', colmap['od_latest'])\
    .withColumnRenamed('total_count', colmap['total_count'])\
    .withColumnRenamed('total_amount', colmap['total_amount'])\
    .withColumnRenamed('score', colmap['score'])\
    .write.csv('hdfs://localhost:9000/datas/result.customerRFM',
               header=True, mode="overwrite")


将hdfs里面生成的文件传送到本地(下载到本地):
spark@vm01:~$ hdfs dfs -get /datas/result.month_sale/part-* ~/mydata/month_sale.csv
spark@vm01:~$ hdfs dfs -get /datas/result.city_sale/part-* ~/mydata/city_sale.csv

将上面两个文件可视化
新建名为:data_visual.py 的python文件

#导入库模块
import pandas as pd
from pyecharts import options as opts
from pyecharts.charts import Bar

#读取文件数据
#从csv文件读取数据,转换为Pandas中的DataFrame二维表
month_sale = pd.read_csv('/home/spark/mydata/month_sale.csv')

#根据实际需要处理每一列的值,分别得到list数组
x = [f'{v}月' for v in month_sale['订单月份'].tolist()]
y1 = [round(v/10000, 2) for v in month_sale['订购数量'].tolist()]
y2 = [round(v/10000/10000, 2) for v in month_sale['金额'].tolist()]
print(x)
print(y1)
print(y2)

结果:
/usr/bin/python3.6 /home/spark/PycharmProjects/BeautyProduct/data_visual.py 
['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月']
[194.74, 214.51, 256.89, 318.45, 359.09, 355.38, 388.48, 383.36, 311.35]
[3.14, 3.43, 4.13, 5.05, 5.75, 5.74, 6.22, 6.08, 4.99]

去文件保存的目录里,查看可视化文件,如果Spark上的浏览器看不到,可以将文件复制在本地电脑上查看

相关文章:

Spark大数据分析案例(pycharm)

所需文件&#xff08;将文件放在路径下&#xff0c;自己记住后面要用&#xff09;&#xff1a; 通过百度网盘分享的文件&#xff1a;beauty_p....csv等4个文件 链接&#xff1a;https://pan.baidu.com/s/1pBAus1yRgefveOc7NXRD-g?pwd22dj 提取码&#xff1a;22dj 复制这段内…...

【QT】ModbusTCP读写寄存器类封装

背景 在编写ModbusTCP时候&#xff0c;连接、寄存器读写属于通用的功能&#xff0c;为了便于后续直接复用&#xff0c;选择封装到一个类。本博文在封装展示该类过程中&#xff0c;会提及到编写该类过程中&#xff0c;出现的连接未成功的问题&#xff0c;以及该问题的解决方式。…...

SQLMesh 内置宏详解:@PIVOT等常用宏的核心用法与示例

本文系统解析 SQLMesh 的四个核心内置宏&#xff0c;涵盖行列转换的 PIVOT、精准去重的 DEDUPLICATE、灵活生成日期范围的 DATE_SPINE&#xff0c;以及动态表路径解析的 RESOLVE_TEMPLATE。通过真实案例演示参数配置与 SQL 渲染逻辑&#xff0c;并对比宏调用与传统 SQL 的差异&…...

ajax post请求 解决自动再get请求一次

ajax post请求 解决自动再get请求一次 HTMLjavascriptFlask第一种方法&#xff1a;第二种方法&#xff1a; HTML <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>登录</title></head> &l…...

当前主流的传输技术(如OTN、IP-RAN、FlexE等)

好的&#xff01;当前主流的传输技术&#xff08;如OTN、IP-RAN、FlexE等&#xff09;各有其独特的应用场景&#xff0c;下面我会逐一展开讲解&#xff0c;并结合实际案例说明它们如何在不同领域发挥作用。 一、OTN&#xff08;光传送网&#xff09; 1. 核心特点 大容量&…...

利用 SQL Server 作业实现异步任务处理,简化系统架构

在现代企业系统中&#xff0c;异步任务是不可或缺的组成部分&#xff0c;例如&#xff1a; 电商系统中的订单超时取消&#xff1b; 报表系统中的异步数据导出&#xff1b; CRM 系统中的客户积分计算。 传统的实现方式通常涉及引入消息队列&#xff08;如 RabbitMQ、Kafka&a…...

【Java高阶面经】3.熔断机制深度优化:从抖动治理到微服务高可用架构实战

一、熔断抖动的本质剖析与核心成因 1.1 熔断机制的核心价值与抖动危害 熔断机制作为微服务弹性架构的核心组件,通过模拟电路断路器逻辑,在服务出现异常时自动阻断请求链,防止故障扩散引发雪崩。但频繁的“熔断-恢复-熔断”抖动会导致: 用户体验恶化:请求成功率波动大,响…...

如何删除 HP 笔记本电脑中的所有数据:3 种解决方案说明

当您准备删除 HP 笔记本电脑中的所有数据时&#xff0c;无论是为了保护您的隐私还是为设备重新启动做好准备&#xff0c;使用正确的方法非常重要。在本文中&#xff0c;您可以获得 3 个有效的解决方案&#xff0c;帮助您轻松删除计算机中的所有内容。之后&#xff0c;您可以安全…...

以太联 - Intellinet 闪耀台北 SecuTech 国际安全科技应用博览会

2025 年 5 月 7 日至 9 日&#xff0c;台北 SecuTech 国际安全科技应用博览会现场热闹非凡&#xff0c;以太联 - Intellinet 携旗下前沿产品与解决方案精彩亮相&#xff0c;成为展会上一道亮丽的风景线&#xff0c;吸引了众多业内人士的目光&#xff0c;收获了广泛关注与高度认…...

JavaScript性能优化实战(13):性能测试与持续优化

在前面的系列文章中,我们探讨了各种JavaScript性能优化的方法和实战案例。然而,优化工作不应仅是一次性的努力,而应当成为开发流程中的常态。本篇将聚焦于如何建立系统化的性能测试体系,并实现持续的性能优化机制,确保应用长期保持出色的性能表现。 前端性能测试体系构建…...

nbufxz动态规划1

草药题 dp[i][j]&#xff0c;考虑i个草药&#xff0c;j个时间&#xff0c;能获得的最大价值。这i个草药中&#xff0c;你不一定全部都采集了。你可能有的采了&#xff0c;有的没采。然后你最终得到了一个最优的结果。 状态转移方程无非就是&#xff1a; dp[i][j] max(dp[i …...

PostgreSQL 初体验

目录 一、PostgreSQL 1. 简介 2. 特点 &#xff08;1&#xff09; 开源免费&#xff08;Open Source&#xff09; &#xff08;2&#xff09;标准兼容&#xff08;SQL Compliance&#xff09; &#xff08;3&#xff09; 丰富的数据类型&#xff08;Data Types&#xff09…...

北斗导航 | 基于matlab的多波束技术的卫星通信系统性能仿真

基于多波束技术的低轨(LEO)卫星通信系统 **1. 仿真场景建模**1.1 LEO卫星轨道参数设置1.2 地面终端分布**2. 多波束天线模型**2.1 波束方向图生成2.2 频率复用方案**3. 链路预算与干扰分析**3.1 自由空间路径损耗3.2 信噪比(SNR)计算**4. 动态资源调度算法**4.1 基于流量需…...

数据结构与算法学习笔记(Acwing 提高课)----动态规划·状态机模型

数据结构与算法学习笔记----动态规划状态机模型 author: 明月清了个风 first publish time: 2025.5.20 ps⭐️背包终于结束了&#xff0c;状态机模型题目不多。状态机其实是一种另类的状态表示方法&#xff0c;将某一个点扩展为一个状态进行保存并在多个状态之间转移&#xf…...

Vue 3.0 中 Teleport 详解

Teleport 是 Vue 3.0 引入的一个非常有用的特性&#xff0c;它允许你将组件的一部分模板"传送"到 DOM 中的其他位置&#xff0c;而不改变组件的逻辑层次结构。 1. 基本概念 Teleport 的主要用途是将某些 DOM 元素渲染到 Vue 应用之外的 DOM 节点中&#xff0c;这在…...

Linux在防火墙中添加开放端口

例如&#xff1a;安装docker时启动报错&#xff1a; Job for docker.service failed because the control process exited with error code. See "systemctl status docker.service" and "journalctl -xe" for details. 此时开放对应端口号就可以咯 在防…...

day24:零基础学嵌入式之系统编程

一、系统编程包含 文件的读写、和常用操作&#xff0c;操作系统已经进入多任务时代&#xff0c;在同一时刻同时运行多个程序。 二、标准io&#xff1b;stdio.h&#xff08;以计算机为中心&#xff09; 1.头文件路径&#xff1a;/usr/include/stdio.h so动态库&#xff1a;st…...

2.10 财务分析

10.1 财务报告构成及列报基本要求 10.1.1 财务报告 1.财务报告的构成 资产负债表、利润表、现金流量表、所有者权益变动表和附注小型企业可不编现金流量表。 2.财务报表及其作用 1.资产负债表的内容及其作用 内容 资产类、流动性大小顺序排序。流动资产、非流动资产负债和…...

docker容器知识

一、docker与docker compose区别&#xff1a; 1、docker是创建和管理单个容器的工具&#xff0c;适合简单的应用或服务&#xff1b; 2、docker compose是管理多容器应用的工具&#xff0c;适合复杂的、多服务的应用程序&#xff1b; 3、docker与docker compose对比&#xff…...

国标GB28181视频EasyGBS视频监控平台搭建城市交通道路可视化管理/道路视频巡检/应急监控指挥

一、方案背景​ 随着城市人口与车辆激增&#xff0c;交通管理面临严峻挑战&#xff1a;高峰期道路拥堵、事故处理滞后、违法取证低效&#xff0c;传统管理模式难以为继。智慧交通依托信息技术&#xff0c;成为破局关键&#xff0c;其中视频监控是实现精细化管理的核心。国标GB…...

【LeetCode 热题 100】有效的括号 / 最小栈 / 字符串解码 / 柱状图中最大的矩形

⭐️个人主页&#xff1a;小羊 ⭐️所属专栏&#xff1a;LeetCode 热题 100 很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~ 目录 栈有效的括号最小栈字符串解码每日温度柱状图中最大的矩形 堆数组中的第K个最大元素 栈 有效的括号 有效的括号 cl…...

Oracle中如何解决BUFFER BUSY WAITS

和BUFFER CACHE相关的常见等待事件还有BUFFER BUSY WAITS。顾名思义&#xff0c;BUFFER BUSY WAITS等待事件指的是多个会话不能共享缓冲区中的数据块而引发的等待事件。 发生BUFFER BUSY WAITS事件时&#xff0c;P1值代表数据文件号&#xff0c;P2值代表数据块号&#xff0c;P3…...

LeetCode 93.复原IP地址 LeetCode 78.子集 LeetCode 90.子集II

LeetCode 93.复原IP地址 其实思想跟回文字符串那道题是类似的&#xff0c;但难点在于这道题的终止条件和判断是否IP地址进行划分后是否合理&#xff1f; 思路&#xff1a; 通过一个int类型的全局变量来记载 " . " 的数目 / 记录你当前所获得的小数组的数目&#x…...

Java转Go日记(四十一):Gorm删除

1.1.1. 删除/软删除 警告删除记录时&#xff0c;需要确保其主要字段具有值&#xff0c;GORM将使用主键删除记录&#xff0c;如果主要字段为空&#xff0c;GORM将删除模型的所有记录 // 删除存在的记录db.Delete(&email)DELETE from emails where id10;// 为Delete语句添加…...

Java基于SpringBoot的公交智能化系统,附源码+文档说明

博主介绍&#xff1a;✌Java老徐、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&…...

电子电器架构 --- 汽车高性能计算

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 钝感力的“钝”,不是木讷、迟钝,而是直面困境的韧劲和耐力,是面对外界噪音的通透淡然。 生活中有两种人,一种人格外在意别人的眼光;另一种人无论…...

Journal of Real-Time Image Processing 投稿过程

投稿要求双栏12页以内(包括参考文献)&#xff0c;这个排版要求感觉不是很严格&#xff0c;我当时就是用普通的双栏的格式去拍的版&#xff0c;然后就提交了&#xff0c;也没单独去下载模版。 投稿过程 12.12 Submission received 12.12 Submission is under technical check 1…...

利用basee64特性 -- BYUCTF 2025 JWTF

题目信息: Unfortunately one of our JWTs was compromised by attackers, so we created a JWT Revocation List to ensure they can’t use it anymore. 代码量很少 # 导入必要的模块 # 从 flask 模块导入 Flask, request, redirect, make_response, jsonify 类和函数 from f…...

湖北理元理律师事务所:科学债务规划如何平衡还款与生活

在债务压力普遍加剧的背景下&#xff0c;如何通过专业规划实现“还款不停生活”&#xff0c;成为许多债务人关注的核心问题。湖北理元理律师事务所基于多年实务经验&#xff0c;总结出一套兼顾法律合规性与人性化需求的债务管理方案&#xff0c;其核心逻辑在于通过法律工具优化…...

1.1HarmonyOS NEXT技术架构深度解析:微内核架构与系统分层

HarmonyOS NEXT技术架构深度解析&#xff1a;微内核架构与系统分层 摘要 作为面向万物互联时代的全场景操作系统&#xff0c;HarmonyOS NEXT通过革命性的星核架构&#xff08;Star Kernel&#xff09;重构了系统底层架构。本文将深入解析HarmonyOS NEXT的微内核设计原理、系统…...

考研系列-408真题计算机组成原理篇(2015-2019)

写在前面 此文章是本人在备考过程中408真题计算机组成原理部分(2015年-2019年)的易错题及相应的知识点整理,后期复习也常常用到,对于知识提炼归纳理解起到了很大的作用,分享出来希望帮助到大家~ # 2015年 1.IO端口 接口电路中可以被CPU直接访问的寄存器 IO控制方式-中断…...

HarmonyOS Next 关键资产的解释

关键资产的安全存储与管理&#xff1a;HarmonyOS Asset Store Kit 深度解析 一、关键资产的定义与重要性 关键资产&#xff08;Critical Asset&#xff09;是指应用运行过程中涉及的短敏感数据&#xff0c;包括但不限于用户密码、身份令牌&#xff08;Token&#xff09;、银行…...

Awesome ChatGPT Prompts:释放AI对话潜力的开源利器

项目概览 Awesome ChatGPT Prompts 是由土耳其开发者 Fatih Kadir Akın 发起的开源项目,托管于 GitHub,旨在通过精心设计的提示词模板(Prompts)优化用户与 ChatGPT 的交互体验。项目以 Markdown 和 CSV 格式管理模板,无需复杂编程语言,但需文本处理能力,目前已在 GitH…...

第6章 C控制语句:循环

目录 6.1 再探while 循环6.2 while语句6.3 比较大小&#xff1a;使用关系运算符和表达式6.4 不确定的循环与计数循环6.5 for循环6.6 更多赋值运算符&#xff1a;、-、*、/和%6.7 逗号运算符6.8 退出条件循环&#xff1a;do while6.9 选择哪种循环6.10 嵌套循环6.11 数组6.12 使…...

海盗王客户端更换横版任务面板的实现

海盗王的任务面板&#xff0c;采用的是竖长设计&#xff0c;上半部分显示任务列表&#xff0c;下半部分显示任务详情。 这样的设计会带来一个问题&#xff1a;就是任务多的时候&#xff0c;不能完整显示&#xff0c;只能显示前面几个&#xff0c;后面的会隐藏到滚动条里面&…...

【git】在Windows上搭建git服务器

1、简述 常用的搭建git服务器的工具有&#xff1a;Gogs、Gitblit、Gitea、GitLab 它们的区别如下&#xff1a; 功能GogsGitblitGiteaGitLab界面语言中文、英文等多语言英文为主中文、英文等多语言英文为主权限管理基础分支权限详细分支权限基础 详细分支权限非常完善代码审查…...

leetcode hot100刷题日记——6.和为 K 的子数组

解答&#xff1a;前缀和思想&#xff0c;见灵茶山艾府大大题解。 &#xff08;1&#xff09;前缀和思想&#xff1a; 前缀和数组prefix_sum的定义是prefix_sum[i] nums[0] nums[1] … nums[i]。如果存在两个前缀和prefix_sum[j]和prefix_sum[i]满足prefix_sum[i] - prefi…...

人工智能的“歧视”:“她数据”在算法运行中隐形

纵观人类的发展史&#xff0c;每一次科技进步都将对性别平等产生深刻影响。尤其是当下&#xff0c;人们对于借助人工智能技术快速发展来弥合性别不平等寄予厚望。 但很多人没想过&#xff0c;人工智能技术本身是客观中立、不存在“算法歧视”“性别偏见的吗&#xff1f; 弗吉…...

Java数组列表 - ArrayList

在Java中&#xff0c;ArrayList是一种非常实用的数据结构&#xff0c;它允许开发者动态地管理数组大小。通过ArrayList&#xff0c;可以轻松地添加、删除和修改元素&#xff0c;以及获取元素和列表的大小。例如&#xff0c;创建一个ArrayList来存储字符串&#xff0c;然后通过a…...

跨境外贸电商供应链一体化ERP管理系统

项目介绍: 跨境外贸电商供应链一体化ERP管理系统 高清视频演示: 跨境外贸电商供应链一体化ERP管理系统_哔哩哔哩_bilibili 系统说明: 外贸电商产品ERP系统包含多个角色&#xff08;客户、客服、工厂、供应商&#xff09;和多个功能模块&#xff0c;以下是系统功能的详细说明…...

数据库表连接结构详解

数据库表连接结构详解 介绍 本文基于提供的SQL表结构&#xff0c;解释了表之间的连接关系。这些表主要涉及AI系统配置&#xff0c;如客户端、顾问和智能体等。通过外键&#xff08;如client_id、agent_id&#xff09;&#xff0c;这些表形成关联网络。 表连接概述 以下是主…...

Vue3.0教程005:watch监视ref定义的【基本类型】数据和【对象类型】数据

文章目录 4、watch监视4.1 前言4.2 情况一4.3 情况二 4、watch监视 4.1 前言 作用&#xff1a;监视数据的变化&#xff08;和vue2中的watch作用一致&#xff09;特点&#xff1a;Vue3中的watch只能监视以下四种数据&#xff1a; ref定义的数据。reactive定义的数据。函数返回…...

【Java的批量操作】

系列文章目录 Java知识点 文章目录 系列文章目录&#x1f449;前言&#x1f449;一、常见批量操作方法&#x1f449;1-1、JDBC 批量操作&#xff08;数据库&#xff09;&#x1f449;1-2、MyBatis 批量操作&#x1f449;1-3、Java 8 Stream 批量处理集合&#x1f449;1-4、多线…...

流复备机断档处理

文章目录 环境症状问题原因解决方案 环境 系统平台&#xff1a;UOS&#xff08;海光&#xff09;,UOS &#xff08;飞腾&#xff09;,UOS&#xff08;鲲鹏&#xff09;,UOS&#xff08;龙芯&#xff09;,UOS &#xff08;申威&#xff09;,银河麒麟svs&#xff08;X86_64&…...

PostgreSQL架构

目录 一、PostgreSQL核心特性与优势 1.PostgreSQL简介 2.PostgreSQL的核心特点 &#xff08;1&#xff09;开源与自由 &#xff08;2&#xff09;高度符合SQL标准 &#xff08;3&#xff09;丰富的数据类型 &#xff08;4&#xff09;事务与并发控制 &#xff08;5&…...

苍穹外卖系统结构与功能报告

一、系统简介 苍穹外卖系统是为餐饮企业定制的数字化解决方案&#xff0c;包含管理端后台和用户端小程序两部分。管理端面向餐饮企业员工&#xff0c;支持菜品、套餐、订单等核心业务的数字化管理&#xff1b;用户端面向消费者&#xff0c;提供在线点餐、支付、订单跟踪等功能…...

CAU数据库class3 关系型数据库基础

关系数据库模型的3个要素 数据结构 二维表 数据操作 特点 操作的对象为元组&#xff0c;操作的结果为元组高度非过程化&#xff0c;用户不关系是怎么实现的 完整性约束 数据完整性是指保证数据真确的特性 实体完整性参照完整性用户定义完整性 关系的形式定义 例子&…...

【Qt】在OrinNX上,使用命令安装qtmultimedia5-dev时报错

1、问题描述 在OrinNX+Ubuntu20.04上,使用命令安装qtmultimedia5-dev时报错 sudo apt install qtmultimedia5-devThe following packages have unmet dependencies: qtmultimedia5-dev : Depends: libpulse-dev but it is not going to be installed E: Unable to correct p…...

阿里云CDN刷新预热--刷新URL

文章目录 一、全英文URL刷新预热二、掺杂中文的URL刷新预热2.1 对带中文URL进行编码2.2 预热刷新 三、CDN刷新-核心作用与价值3.1 核心作用3.2 核心价值3.3 典型使用场景 *最后我想说&#xff1a;请你不要相信我说的每一句话&#xff0c;这只是我的个人经验* 一、全英文URL刷新…...

anaconda、miniconda、conda的关系及miniconda安装

anaconda、miniconda、conda的关系及miniconda安装 文章目录 前言正文定义关系Linux安装miniconda新建一个python3.8环境 参考 前言 本文用于记录关于Anaconda、conda和Miniconda的定义及其关系的总结123&#xff1a; 正文 定义 conda 一个跨平台的开源包管理和环境管理工具…...