Spark_算子調(diào)優(yōu)
1225
2025-04-02
學(xué)習(xí)總結(jié)
文章目錄
學(xué)習(xí)總結(jié)
一、數(shù)據(jù)統(tǒng)計(jì)
1.1 讀取文件
1.2 保存讀取的信息
1.3 分析每列的類型,取值個(gè)數(shù)
1.4 分析每列是否包含缺失值
二、分組聚合
2.1 學(xué)習(xí)groupby分組聚合的使用
2.2 學(xué)習(xí)agg分組聚合的使用
2.3 transform的使用
Reference
一、數(shù)據(jù)統(tǒng)計(jì)
1.1 讀取文件
步驟1:讀取文件https://cdn.coggle.club/Pokemon.csv
import pandas as pd from pyspark.sql import SparkSession # 創(chuàng)建spark應(yīng)用 spark = SparkSession.builder.appName('mypyspark').getOrCreate() # 用python鏈接spark環(huán)境 from pyspark import SparkFiles spark.sparkContext.addFile('https://cdn.coggle.club/Pokemon.csv') df = spark.read.csv(SparkFiles.get('Pokemon.csv'), header = True, inferSchema = True) df.show(5)
1
2
3
4
5
6
7
8
9
10
11
12
13
并且我們將表頭屬性有.的部分進(jìn)行更名:
#重命名 df = df.withColumnRenamed('Sp. Atk', 'Sp Atk') df = df.withColumnRenamed('Sp. Def', 'Sp Def') df.show(5)
1
2
3
4
5
1.2 保存讀取的信息
步驟2:將讀取的進(jìn)行保存,表頭也需要保存,這里可保存為csv或者json格式文件。
#df.write df.write.csv(path='Pokemon.csv',mode='overwrite', header=True ) df.write.json(path='Pokemon.json',mode='overwrite' )
1
2
3
4
1.3 分析每列的類型,取值個(gè)數(shù)
步驟3:分析每列的類型,取值個(gè)數(shù),這里就可以使用df.describe分析每列的最大值、最小值、平均值、方差等特性了(下面我只貼出HP的結(jié)果)。
for column in df.columns: df.describe(column).show()
1
2
1.4 分析每列是否包含缺失值
步驟4:分析每列是否包含缺失值,打印出有缺失值的樣本數(shù),占總數(shù)的比例。
df.filter(df['Type 2'].isNull()).count() # 386 # 轉(zhuǎn)換成pandas,打印出每一列的缺失值個(gè)數(shù) df.toPandas().isnull().sum() # 結(jié)果: Name 0 Type 1 0 Type 2 386 Total 0 HP 0 Attack 0 Defense 0 Sp Atk 0 Sp Def 0 Speed 0 Generation 0 Legendary 0 dtype: int64
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
打印出有缺失值的樣本數(shù),占總數(shù)的比例:
for col in df.columns: print(col, df.filter(df[col].isNull()).count()/df.count()) Name 0.0 Type 1 0.0 Type 2 0.4825 Total 0.0 HP 0.0 Attack 0.0 Defense 0.0 Sp Atk 0.0 Sp Def 0.0 Speed 0.0 Generation 0.0 Legendary 0.0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
二、分組聚合
讀取文件https://cdn.coggle.club/Pokemon.csv
和剛才的步驟一是一樣的。
import pandas as pd from pyspark.sql import SparkSession # 創(chuàng)建spark應(yīng)用 spark = SparkSession.builder.appName('mypyspark').getOrCreate() # 用python鏈接spark環(huán)境 from pyspark import SparkFiles spark.sparkContext.addFile('https://cdn.coggle.club/Pokemon.csv') df = spark.read.csv(SparkFiles.get('Pokemon.csv'), header = True, inferSchema = True) df.show(5)
1
2
3
4
5
6
7
8
9
10
11
12
13
2.1 學(xué)習(xí)groupby分組聚合的使用
和sql的group by一樣意思,分組聚合,下面找到Type 1對(duì)應(yīng)數(shù)據(jù)進(jìn)行分組和計(jì)數(shù)。
# Type 1 各種數(shù)量 df.groupby('Type 1').count().show(5)
1
2
還可以分組后(按照Type 1分組)計(jì)算每組內(nèi)的HP平均值:
df.groupBy(['Type 1']).avg('HP').show(5) +------+-----------------+ |Type 1| avg(HP)| +------+-----------------+ | Water| 72.0625| |Poison| 67.25| | Steel|65.22222222222223| | Rock|65.36363636363636| | Ice| 72.0| +------+-----------------+ only showing top 5 rows
1
2
3
4
5
6
7
8
9
10
11
12
而如果是計(jì)算每組的個(gè)數(shù):
# Type 1 各種數(shù)量 df.groupby('Type 1').count().show(5) +------+-----+ |Type 1|count| +------+-----+ | Water| 112| |Poison| 28| | Steel| 27| | Rock| 44| | Ice| 24| +------+-----+ only showing top 5 rows
1
2
3
4
5
6
7
8
9
10
11
12
13
2.2 學(xué)習(xí)agg分組聚合的使用
和2.1一樣實(shí)現(xiàn)分組后(按照Type 1分組)計(jì)算每組內(nèi)的HP平均值,我們也可以用agg分組聚合,{'HP': 'mean'}為參數(shù)。
df.groupBy('Type 1').agg({'HP': 'mean'}).show(5) +------+-----------------+ |Type 1| avg(HP)| +------+-----------------+ | Water| 72.0625| |Poison| 67.25| | Steel|65.22222222222223| | Rock|65.36363636363636| | Ice| 72.0| +------+-----------------+ only showing top 5 rows
1
2
3
4
5
6
7
8
9
10
11
12
當(dāng)數(shù)據(jù)量不是很多時(shí),可以使用toPandas轉(zhuǎn)成pandas的dataframe,然后使用pandas的各種函數(shù):
df.toPandas().groupby('Type 1', as_index=False)['HP'].agg({'hp_mean': 'mean'})
1
2.3 transform的使用
transform的參數(shù)如下,可以看到需要傳入一個(gè)函數(shù)(用于轉(zhuǎn)換數(shù)據(jù))。
DataFrame.transform(func: Callable[[…], Series], axis: Union[int, str] = 0, *args: Any, **kwargs: Any) → DataFrame
1
如果我們要按照Type 1分組后,求組內(nèi)關(guān)于HP的平均值,可以將np.mean函數(shù)傳入transform,具體介紹可以參考pyspark官方文檔。
df.toPandas().groupby('Type 1')['HP'].transform(np.mean) 0 67.271429 1 67.271429 2 67.271429 3 67.271429 4 69.903846 ... 795 65.363636 796 65.363636 797 70.631579 798 70.631579 799 69.903846 Name: HP, Length: 800, dtype: float64
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Reference
pyspark官方文檔
https://spark.apache.org/docs/latest/quick-start.html
https://spark.apache.org/docs/latest/sql-programming-guide.html
https://github.com/apache/spark/tree/4f25b3f712/examples/src/main/python
https://sparkbyexamples.com/pyspark-tutorial/
https://www.tutorialspoint.com/pyspark/index.htm
pyspark—agg的用法
spark
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。