pyspark 数据处理的三种方式RDD、DataFrame、Spark SQL案例

目录

  • 一、浅语
  • 二、三种数据处理方式比较
    • 2.1 RDD
    • 2.2 DataFrame
    • 2.3 Spark SQL
  • 三、三种方法的创建方式
    • 3.1 创建RDD
    • 3.2 创建DataFrame
      • 3.2.1 创建sqlContext
      • 3.2.2 定义Schema
      • 3.2.3 创建DataFrame
    • 3.3 创建SparkSQL
      • 3.3.1 登录临时表
      • 3.3.2 使用sparkSQL
  • 四、三种方法显示部分字段
    • 4.1 使用RDD选取显示部分字段
    • 4.2 使用DataFrame选取显示字段
      • 4.2.1 select方法输入[字段名]
      • 4.2.2 select方法输入[dataframe名称].[字段名]
      • 4.2.3 select方法输入[dataframe别名].[字段名]
      • 4.2.4 通过dataframe中括号方式
    • 4.3 使用SparkSQL选取显示字段
  • 五、三种方法增加计算字段
    • 5.1 RDD增加计算字段
    • 5.2 DataFrame增加计算字段
    • 5.3 SparkSQL增加计算字段
  • 六、三种方法筛选数据
    • 6.1 RDD筛选数据
    • 6.2 DataFrame筛选数据
      • 6.2.1 使用多个filter
      • 6.2.2 使用单个filter
      • 6.2.3 使用[dataframe 名称].[字段名]指定条件
      • 6.2.4 使用[]指定筛选条件
    • 6.3 SparkSQL筛选数据
  • 七、三种方法按单个字段给数据排序
    • 7.1 RDD:takeOrdered方法
    • 7.2 DataFrame
    • 7.3 SQparkSQL
  • 八、三种方法按多个字段排序
    • 8.1 RDD
    • 8.2 DataFrame
    • 8.3 SparkSQL
  • 九、三种方法显示不重复的数据
    • 9.1 RDD
    • 9.2 DataFrame
    • 9.3 SparkSQL
  • 十、三种方法分组统计数据
    • 10.1 RDD:map/reduce
    • 10.2 DataFrame
      • 10.2.1 crosstab:长表变宽表
    • 10.3 SparkSQL
  • 参考资料


在这里插入图片描述

一、浅语

上一篇(《pyspark RDD相关常用函数使用案例》) 对pyspark的一些常用函数做了梳理,这篇主要是针对RDD、DataFrame、SparkSql三种实现同一功能需要的方式做一梳理,通过实际动手,体会不同方式在数据处理过程中的差异性、便利性。

import findspark
findspark.init() 
from pyspark.sql import SparkSession# 创建 Spark 会话
spark = SparkSession.builder \.appName("Test PySpark") \.master("local[*]") \.getOrCreate()
sc=spark.sparkContext
sc.master
'local[*]'

二、三种数据处理方式比较

2.1 RDD

  • rdd的数据</font color-“green”>只能使用位置来指定每一个字段。
  • rdd功能最强,能完成所有spark功能。

2.2 DataFrame

  • Spark DataFrame被创建时</font color=“green”>必须定义Schema,定义每个字段名和数据类型。
  • 定义了很多类似SQL的方法
  • 比起RDD更容易使用

2.3 Spark SQL

  • 有DataFrame派生出来,所以</font color=“green”>必须先创建DataFrame,进而转化使用。
  • 最简单

三、三种方法的创建方式

3.1 创建RDD

# 读取本地数据文件
mRDD = sc.textFile("test.txt")
print('查看数据的行数:',mRDD.count())
# 按照空格分隔数据字段
sRDD = mRDD.map(lambda x:x.split(' '))
print('查看分隔后的结果:',sRDD.collect())
查看数据的行数: 8
查看分隔后的结果: [['yellow', '1', 'F'], ['blue', '2', 'M'], ['yellow', '3', 'F'], ['black', '4', 'F'], ['red', '5', 'M'], ['red', '5', 'M'], ['blue', '3', 'M'], ['blue', '7', 'M']]

3.2 创建DataFrame

3.2.1 创建sqlContext

sqlContext = SparkSession.builder.getOrCreate()

3.2.2 定义Schema

from pyspark.sql import Row
sRows = sRDD.map(lambda x:Row(color=x[0],num = int(x[1]),sex = x[2]))
# 查看schema
sRows.collect()
[Row(color='yellow', num=1, sex='F'),Row(color='blue', num=2, sex='M'),Row(color='yellow', num=3, sex='F'),Row(color='black', num=4, sex='F'),Row(color='red', num=5, sex='M'),Row(color='red', num=5, sex='M'),Row(color='blue', num=3, sex='M'),Row(color='blue', num=7, sex='M')]

3.2.3 创建DataFrame

# 创建DataFrame¶
df = sqlContext.createDataFrame(sRows)
# 使用.printSchema()查看DataFrame的schema
df.printSchema()
root|-- color: string (nullable = true)|-- num: long (nullable = true)|-- sex: string (nullable = true)
# 查看数据
df.show()
+------+---+---+
| color|num|sex|
+------+---+---+
|yellow|  1|  F|
|  blue|  2|  M|
|yellow|  3|  F|
| black|  4|  F|
|   red|  5|  M|
|   red|  5|  M|
|  blue|  3|  M|
|  blue|  7|  M|
+------+---+---+
### 为DataFrame创建别名
dataf = df.alias('dataf')
dataf.show()
+------+---+---+
| color|num|sex|
+------+---+---+
|yellow|  1|  F|
|  blue|  2|  M|
|yellow|  3|  F|
| black|  4|  F|
|   red|  5|  M|
|   red|  5|  M|
|  blue|  3|  M|
|  blue|  7|  M|
+------+---+---+

3.3 创建SparkSQL

3.3.1 登录临时表

dataf.registerTempTable('temp_tb')
D:\bigdataenv\spark-3.5.0-bin-hadoop3\python\pyspark\sql\dataframe.py:329: FutureWarning: Deprecated in 2.0, use createOrReplaceTempView instead.warnings.warn("Deprecated in 2.0, use createOrReplaceTempView instead.", FutureWarning)

3.3.2 使用sparkSQL

查看数据使用show()方法,默认显示前20行数据

sqlContext.sql('select * from temp_tb').show()
+------+---+---+
| color|num|sex|
+------+---+---+
|yellow|  1|  F|
|  blue|  2|  M|
|yellow|  3|  F|
| black|  4|  F|
|   red|  5|  M|
|   red|  5|  M|
|  blue|  3|  M|
|  blue|  7|  M|
+------+---+---+

四、三种方法显示部分字段

4.1 使用RDD选取显示部分字段

rdd = sRDD.map(lambda x:(x[0],x[2],x[1]))
rdd.take(2)
[('yellow', 'F', '1'), ('blue', 'M', '2')]

4.2 使用DataFrame选取显示字段

下面四种方法显示的结果相同。

4.2.1 select方法输入[字段名]

df.select('color','sex').show()
+------+---+
| color|sex|
+------+---+
|yellow|  F|
|  blue|  M|
|yellow|  F|
| black|  F|
|   red|  M|
|   red|  M|
|  blue|  M|
|  blue|  M|
+------+---+

4.2.2 select方法输入[dataframe名称].[字段名]

df.select(df.color,df.sex).show()
+------+---+
| color|sex|
+------+---+
|yellow|  F|
|  blue|  M|
|yellow|  F|
| black|  F|
|   red|  M|
|   red|  M|
|  blue|  M|
|  blue|  M|
+------+---+

4.2.3 select方法输入[dataframe别名].[字段名]

dataf.select(dataf.color,dataf.sex).show()
+------+---+
| color|sex|
+------+---+
|yellow|  F|
|  blue|  M|
|yellow|  F|
| black|  F|
|   red|  M|
|   red|  M|
|  blue|  M|
|  blue|  M|
+------+---+

4.2.4 通过dataframe中括号方式

df[df['color'],df['sex']].show()
+------+---+
| color|sex|
+------+---+
|yellow|  F|
|  blue|  M|
|yellow|  F|
| black|  F|
|   red|  M|
|   red|  M|
|  blue|  M|
|  blue|  M|
+------+---+

4.3 使用SparkSQL选取显示字段

sqlContext.sql('select color,sex from temp_tb').show()
+------+---+
| color|sex|
+------+---+
|yellow|  F|
|  blue|  M|
|yellow|  F|
| black|  F|
|   red|  M|
|   red|  M|
|  blue|  M|
|  blue|  M|
+------+---+

五、三种方法增加计算字段

5.1 RDD增加计算字段

sRDD.map(lambda x:(x[0],x[1],x[2],10-int(x[1]))).collect()
[('yellow', '1', 'F', 9),('blue', '2', 'M', 8),('yellow', '3', 'F', 7),('black', '4', 'F', 6),('red', '5', 'M', 5),('red', '5', 'M', 5),('blue', '3', 'M', 7),('blue', '7', 'M', 3)]

5.2 DataFrame增加计算字段

df.select('color','num','sex',10-df['num']).show()
+------+---+---+----------+
| color|num|sex|(10 - num)|
+------+---+---+----------+
|yellow|  1|  F|         9|
|  blue|  2|  M|         8|
|yellow|  3|  F|         7|
| black|  4|  F|         6|
|   red|  5|  M|         5|
|   red|  5|  M|         5|
|  blue|  3|  M|         7|
|  blue|  7|  M|         3|
+------+---+---+----------+
# 为计算字段取一个别名
df.select('color','num','sex',(10-df['num']).alias('diff_num')).show()
+------+---+---+--------+
| color|num|sex|diff_num|
+------+---+---+--------+
|yellow|  1|  F|       9|
|  blue|  2|  M|       8|
|yellow|  3|  F|       7|
| black|  4|  F|       6|
|   red|  5|  M|       5|
|   red|  5|  M|       5|
|  blue|  3|  M|       7|
|  blue|  7|  M|       3|
+------+---+---+--------+

5.3 SparkSQL增加计算字段

sqlContext.sql('select color,num,sex,10-num as diff_num from temp_tb').show()
+------+---+---+--------+
| color|num|sex|diff_num|
+------+---+---+--------+
|yellow|  1|  F|       9|
|  blue|  2|  M|       8|
|yellow|  3|  F|       7|
| black|  4|  F|       6|
|   red|  5|  M|       5|
|   red|  5|  M|       5|
|  blue|  3|  M|       7|
|  blue|  7|  M|       3|
+------+---+---+--------+

六、三种方法筛选数据

6.1 RDD筛选数据

sRDD.filter(lambda x:int(x[1])>2).collect()
[['yellow', '3', 'F'],['black', '4', 'F'],['red', '5', 'M'],['red', '5', 'M'],['blue', '3', 'M'],['blue', '7', 'M']]

6.2 DataFrame筛选数据

四种筛选方式,执行结果相同。

6.2.1 使用多个filter

df.filter("color='blue'").filter('num=2').show()
+-----+---+---+
|color|num|sex|
+-----+---+---+
| blue|  2|  M|
+-----+---+---+

6.2.2 使用单个filter

df.filter("color='blue' and num=2 ").show()
+-----+---+---+
|color|num|sex|
+-----+---+---+
| blue|  2|  M|
+-----+---+---+

6.2.3 使用[dataframe 名称].[字段名]指定条件

注意:

  • 必须使用“&”,不能使用“and”
  • 必须使用“==”,不能使用“=”
df.filter((df.color=='blue') & (df.num==2)).show()
+-----+---+---+
|color|num|sex|
+-----+---+---+
| blue|  2|  M|
+-----+---+---+

6.2.4 使用[]指定筛选条件

df.filter((df['color']=='blue') & (df['num']==2)).show()
+-----+---+---+
|color|num|sex|
+-----+---+---+
| blue|  2|  M|
+-----+---+---+

6.3 SparkSQL筛选数据

sqlContext.sql("""select * from temp_tb where color='blue' and num=2    """).show()
+-----+---+---+
|color|num|sex|
+-----+---+---+
| blue|  2|  M|
+-----+---+---+

七、三种方法按单个字段给数据排序

7.1 RDD:takeOrdered方法

takeOrdered(num,key=None):

  • num:要显示的项数
  • key:使用lambda语句设置要排序的字段
# 升序示例
sRDD.takeOrdered(3,key=lambda x:int(x[1]))
[['yellow', '1', 'F'], ['blue', '2', 'M'], ['yellow', '3', 'F']]
# 降序示例
sRDD.takeOrdered(3,key=lambda x: -1 * int(x[1]))
[['blue', '7', 'M'], ['red', '5', 'M'], ['red', '5', 'M']]

7.2 DataFrame

# 升序
df.orderBy('num').show()
+------+---+---+
| color|num|sex|
+------+---+---+
|yellow|  1|  F|
|  blue|  2|  M|
|  blue|  3|  M|
|yellow|  3|  F|
| black|  4|  F|
|   red|  5|  M|
|   red|  5|  M|
|  blue|  7|  M|
+------+---+---+
# 降序
df.orderBy('num',ascending=0).show()
+------+---+---+
| color|num|sex|
+------+---+---+
|  blue|  7|  M|
|   red|  5|  M|
|   red|  5|  M|
| black|  4|  F|
|  blue|  3|  M|
|yellow|  3|  F|
|  blue|  2|  M|
|yellow|  1|  F|
+------+---+---+

7.3 SQparkSQL

# 升序
sqlContext.sql('select * from temp_tb order by num').show()
+------+---+---+
| color|num|sex|
+------+---+---+
|yellow|  1|  F|
|  blue|  2|  M|
|  blue|  3|  M|
|yellow|  3|  F|
| black|  4|  F|
|   red|  5|  M|
|   red|  5|  M|
|  blue|  7|  M|
+------+---+---+
# 降序sqlContext.sql('select * from temp_tb order by num desc').show()
+------+---+---+
| color|num|sex|
+------+---+---+
|  blue|  7|  M|
|   red|  5|  M|
|   red|  5|  M|
| black|  4|  F|
|  blue|  3|  M|
|yellow|  3|  F|
|  blue|  2|  M|
|yellow|  1|  F|
+------+---+---+

八、三种方法按多个字段排序

8.1 RDD

# 先num降序,color升序
sRDD.takeOrdered(3,key = lambda x: (-1*x[1],x[0]))
[['black', '4', 'F'], ['blue', '2', 'M'], ['blue', '3', 'M']]

8.2 DataFrame

df.orderBy(['num','color'],ascending=[0,1]).show()
+------+---+---+
| color|num|sex|
+------+---+---+
|  blue|  7|  M|
|   red|  5|  M|
|   red|  5|  M|
| black|  4|  F|
|  blue|  3|  M|
|yellow|  3|  F|
|  blue|  2|  M|
|yellow|  1|  F|
+------+---+---+
df.orderBy(df.num.desc(),df.color).show()
+------+---+---+
| color|num|sex|
+------+---+---+
|  blue|  7|  M|
|   red|  5|  M|
|   red|  5|  M|
| black|  4|  F|
|  blue|  3|  M|
|yellow|  3|  F|
|  blue|  2|  M|
|yellow|  1|  F|
+------+---+---+

8.3 SparkSQL

sqlContext.sql("select * from temp_tb order by num desc , color ").show()
+------+---+---+
| color|num|sex|
+------+---+---+
|  blue|  7|  M|
|   red|  5|  M|
|   red|  5|  M|
| black|  4|  F|
|  blue|  3|  M|
|yellow|  3|  F|
|  blue|  2|  M|
|yellow|  1|  F|
+------+---+---+

九、三种方法显示不重复的数据

9.1 RDD

sRDD.map(lambda x:x[2]).distinct().collect()
['F', 'M']
sRDD.map(lambda x:(x[1],x[2])).distinct().collect()
[('3', 'F'),('4', 'F'),('5', 'M'),('3', 'M'),('7', 'M'),('1', 'F'),('2', 'M')]

9.2 DataFrame

df.select('sex').distinct().show()
+---+
|sex|
+---+
|  F|
|  M|
+---+
df.select('num','sex').distinct().show()
+---+---+
|num|sex|
+---+---+
|  2|  M|
|  3|  F|
|  4|  F|
|  1|  F|
|  5|  M|
|  3|  M|
|  7|  M|
+---+---+

9.3 SparkSQL

sqlContext.sql("select distinct sex from temp_tb").show()
+---+
|sex|
+---+
|  F|
|  M|
+---+
sqlContext.sql("select distinct num,sex from temp_tb").show()
+---+---+
|num|sex|
+---+---+
|  2|  M|
|  3|  F|
|  4|  F|
|  1|  F|
|  5|  M|
|  3|  M|
|  7|  M|
+---+---+

十、三种方法分组统计数据

10.1 RDD:map/reduce

在RDD中进行数据的分组统计,必须使用map/reduce

# 单字段:eg:按照sex分组统计
sRDD.map(lambda x:(x[2],int(x[1]))).reduceByKey(lambda x,y:x+y).collect()
[('F', 8), ('M', 22)]
# 多字段
sRDD.map(lambda x:((x[2],x[0]),int(x[1]))).reduceByKey(lambda x,y:x+y).collect()
[(('F', 'yellow'), 4),(('M', 'blue'), 12),(('F', 'black'), 4),(('M', 'red'), 10)]

10.2 DataFrame

df.select(['sex','num']).groupBy('sex').sum().show()
+---+--------+
|sex|sum(num)|
+---+--------+
|  F|       8|
|  M|      22|
+---+--------+
df.select(['sex','color','num']).groupBy(['sex','color']).sum().orderBy(['sex','color']).show()
+---+------+--------+
|sex| color|sum(num)|
+---+------+--------+
|  F| black|       4|
|  F|yellow|       4|
|  M|  blue|      12|
|  M|   red|      10|
+---+------+--------+

10.2.1 crosstab:长表变宽表

df.crosstab('color','sex').show()
+---------+---+---+
|color_sex|  F|  M|
+---------+---+---+
|   yellow|  2|  0|
|      red|  0|  2|
|    black|  1|  0|
|     blue|  0|  3|
+---------+---+---+

10.3 SparkSQL

sqlContext.sql('select sex,sum(num) from temp_tb group by sex').show()
+---+--------+
|sex|sum(num)|
+---+--------+
|  F|       8|
|  M|      22|
+---+--------+

参考资料

《Python+Spark 2.0+Hadoop机器学习与大数据实战》, 林大贵,清华大学出版社,2017-12,9787302490739

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

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

相关文章

文件解析漏洞靶机---- 练习通关攻略

1.安装靶机 点击 hackme.ova 文件&#xff0c;直接导入虚拟机&#xff0c;选择存储位置 2. 开启靶机 3. kali扫描同C段的ip&#xff0c;找到靶机ip nmap 192.168.182.1/24 经判断&#xff0c;靶机ip为&#xff1a;192.168.182.157 开启端口 http 80 、ssh 远程连接 22 4…

信号处理抽取多项滤波的数学推导与仿真

昨天的《信号处理之插值、抽取与多项滤波》&#xff0c;已经介绍了插值抽取的多项滤率&#xff0c;今天详细介绍多项滤波的数学推导&#xff0c;并附上实战仿真代码。 一、数学变换推导 1. 多相分解的核心思想 将FIR滤波器的系数 h ( n ) h(n) h(n)按相位分组&#xff0c;每…

【大模型基础_毛玉仁】2.3 基于 Encoder-only 架构的大语言模型

更多内容&#xff1a;XiaoJ的知识星球 目录 2.3 基于Encoder-only 架构的大语言模型2.3.1 Encoder-only 架构2.3.2 BERT 语言模型1&#xff09;BERT 模型结构2&#xff09;BERT 预训练方式3&#xff09;BERT 下游任务 2.3.3 BERT 衍生语言模型1&#xff09;RoBERTa 语言模型2&a…

AIP-165 按条件删除

编号165原文链接https://google.aip.dev/165状态批准创建日期2019-12-18更新日期2019-12-18 有时API需要提供一种机制&#xff0c;按照一些过滤参数删除大量资源&#xff0c;而非提供待删除的各资源名字。 这是一个稀有的场景&#xff0c;用于用户一次性删除数千或更多资源的…

【Maven教程与实战案例】

文章目录 前言一、Maven是什么&#xff1f;二、Maven的安装与配置1. 安装前置条件2. 下载与配置 Maven3. 验证安装 三、Maven的核心概念1. POM.xml 文件2. 构建生命周期与插件机制 四、实战项目示例1. 项目目录结构2. 编写代码App.javaAppTest.java 3. 构建项目4. 运行项目 前言…

20250310:OpenCV mat对象与base64互转

代码: https://github.com/ReneNyffenegger/cpp-base64 指南:https://renenyffenegger.ch/notes/development/Base64/Encoding-and-decoding-base-64-with-cpp/ 实操:

概率论的基本知识

逆概率还不懂&#xff0c;改天再想想。 联合概率 联合概率&#xff08;Joint Probability&#xff09; 是概率论中的一个重要概念&#xff0c;用于描述多个随机变量同时取某些值的概率。联合概率可以帮助我们理解多个变量之间的关系。

pytest数据库测试文章推荐

参考链接&#xff1a; 第一部分&#xff1a;http://alextechrants.blogspot.fi/2013/08/unit-testing-sqlalchemy-apps.html第二部分&#xff1a;http://alextechrants.blogspot.fi/2014/01/unit-testing-sqlalchemy-apps-part-2.html

如何自己做奶茶,从此告别奶茶店

自制大白兔奶茶&#xff0c;奶香与茶香激情碰撞&#xff0c;每一口都是香浓与甜蜜的双重诱惑&#xff0c;好喝到跺脚&#xff01;丝滑口感在舌尖舞动&#xff0c;仿佛味蕾在开派对。 简单几步就能复刻&#xff0c;成本超低&#xff0c;轻松在家享受奶茶自由。 材料:大白兔奶糖&…

SOA(面向服务架构)与微服务架构的区别与联系

SOA&#xff08;面向服务架构&#xff09;与微服务架构的区别与联系 1. 引言 在现代软件架构中&#xff0c;SOA&#xff08;Service-Oriented Architecture&#xff0c;面向服务架构&#xff09;和微服务架构&#xff08;Microservices Architecture&#xff09;是两种常见的…

LLM的准确率评估采用什么方式:准确率评估使用的是 `sklearn.metrics` 模块中的 `accuracy_score` 函数

LLM的准确率评估采用什么方式:准确率评估使用的是 sklearn.metrics 模块中的 accuracy_score 函数 评估方式 代码里的准确率评估是基于每个样本最后一个预测的 token 与真实的 token 进行对比。具体来说,它会遍历测试数据集中的每个样本,使用模型预测出最后一个 token 的 …

文件和异常

从文件中读取数据 读取整个文件 读取整个文件 要读取文件&#xff0c;需要一个包含几行文本的文件。下面首先创建一个文件&#xff0c;它包含精确 到小数点后30位的圆周率值&#xff0c;且在小数点后每10位处换行&#xff1a; pi_digits.txt 3.14159265358979323846264338…

2025最新版Windows通过GoLand远程连接Linux构建Go项目保姆级教学

以Ubuntu24.04和GoLand2024.1.6为例子&#xff0c;演示如何在Windows上通过GoLand远程连接Linux进行Go编程。 通过go version指令可以发现当前Ubuntu系统没有安装go。 go version 通过指令安装go&#xff0c;其他系统可以通过wget安装&#xff0c;要指定安装的具体go版本&…

Spring Boot 集成 Lua 脚本:实现高效业务逻辑处理

1. 前言 1.1 什么是Lua Lua是一种轻量级、高性能的脚本语言,常用于游戏开发、嵌入式系统、配置文件解析等领域。Lua语法简洁,易于学习和使用,且具有强大的扩展性。 1.2 Spring Boot与Lua集成的意义 将Lua集成到Spring Boot应用中,可以实现动态配置业务逻辑、简化复杂业…

Linux笔记---文件系统硬件部分

1. 文件系统 文件系统是操作系统用于明确存储设备&#xff08;常见的是磁盘&#xff0c;也有基于NAND Flash的固态硬盘&#xff09;或分区上的文件的方法和数据结构&#xff0c;即在存储设备上组织文件的方法。 1.1 基本组成 索引节点&#xff08;inode&#xff09;&#xff…

12.31[net]review

复用&#xff08;Multiplexing&#xff09;的概念 定义&#xff1a;在传输层&#xff0c;复用是指多个应用进程可以使用同一个传输层协议&#xff08;如 TCP 或 UDP&#xff09;来发送数据。从应用层的角度看&#xff0c;不同的应用进程&#xff08;如网页浏览器、邮件客户端等…

网络安全防护架构有哪些 网络安全防护措施包括

网络安全预防措施 网安措施 计算机网络安全措施主要包括保护网络安全、保护应用服务安全和保护系统安全三个方面&#xff0c;各个方面都要结合考虑安全防护的物理安全、防火墙、信息安全、Web安全、媒体安全等等。 (一)保护网络安全。 网络安全是为保护商务各方网络端系统之…

物理笔记 | 拓扑相变的物理图像

1. 一般相变 对于一般的相变是朗道理论预言的由对称性自发破缺导致的。 比如在一维横场Ising模型中的量子相变 H − J ∑ j σ j z σ j 1 z − h ∑ j σ j x H -J \sum_{j} \sigma_j^z \sigma_{j1}^z - h \sum_{j} \sigma_j^x H−Jj∑​σjz​σj1z​−hj∑​σjx​ 其相…

红黑树介绍

1 问题引入 为什么有AVL树&#xff0c;还要引入红黑树&#xff1f; 在进行多次的插入和删除时&#xff1a; 1&#xff09;AVL树会存在大量的旋转操作&#xff0c;追求的是严格平衡&#xff1b; 2&#xff09;红黑树通过为节点增加颜色来换取增删节点时旋转次数…

Java基础:枚举类enum入门案例

1.基础枚举定义与使用&#xff1a; package com.zxy;public class Main {public static void main(String[] args) { // 获取枚举值cars car cars.BMW;switch (car){case BMW :System.out.println("BMW");break;case BENZ :System.out.println("BENZ&…