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.pswp.cn/news/897736.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/897736.shtml
英文地址,請注明出處:http://en.pswp.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&…