大數據分析與應用實驗任務九

大數據分析與應用實驗任務九

實驗目的

  • 進一步熟悉pyspark程序運行方式;

  • 熟練掌握pysaprkRDD基本操作相關的方法、函數,解決基本問題。

實驗任務

進入pyspark實驗環境,打開命令行窗口,輸入pyspark,完成下列任務:

在實驗環境中自行選擇路徑新建以自己姓名拼音命名的文件夾,后續代碼中涉及的文件請保存到該文件夾下(需要時文件夾中可以創建新的文件夾)。

一、參考書中相應代碼,練習RDD持久性、分區及寫入文件(p64、67、80頁相應代碼)。
1.持久化

迭代計算經常需要多次重復使用同一組數據。下面就是多次計算同一個RDD的例子。

listlzy=["Hadoop","Spark","Hive","Darcy"]
rddlzy=sc.parallelize(listlzy)
print(rddlzy.count())#行動操作,觸發一次真正從頭到尾的計算
print(','.join(rddlzy.collect()))#行動操作,觸發一次真正從頭到尾的計算

image-20231123112954850

一般而言,使用cache()方法時,會調用persist(MEMORY_ONLY)。針對上面的實例,增加持久化語句以后的執行過程如下:

listlzy=["Hadoop","Spark","Hive","Darcy"]
rdd=sc.parallelize(listlzy)
rdd.cache()#會調用persist(MEMORY_ONLY),但是,語句執行到這里,并不會緩存rdd,因為這時rdd還沒有被計算生成
print(rdd.count())#第一次行動操作,觸發一次真正從頭到尾的計算,這時上面的rdd.cache()才會被執行,把這個rdd放到緩存中
print(','.join(rdd.collect()))#第二次行動操作,不需要觸發從頭到尾的計算,只需要重復使用上面緩存中的rdd

image-20231123113247048

2.分區
  • 設置分區的個數

    在調用textFile()和parallelize()方法的時候手動指定分區個數即可,語法格式如下:

    sc.textFile(path,partitionNum)
    

    其中,path參數用于指定要加載的文件的地址,partitionNum參數用于指定分區個數。下面是一個分區的實例。

    listlzy=[5,2,0,1,3,1,4]
    rddlzy=sc.parallelize(listlzy,2)//設置兩個分區
    

    image-20231123113420685

  • 使用repartition方法重新設置分區個數

    通過轉換操作得到新RDD時,直接調用repartition方法即可。例如

datalzy=sc.parallelize([1,2,3,4,5],2)
len(datalzy.glom().collect())#顯示datalzy這個RDD的分區數量
rdd = datalzy.repartition(1) #對 data 這個 RDD 進行重新分區
len(rdd.glom().collect()) #顯示 rdd 這個 RDD 的分區數量

image-20231123113519540

  • 自定義分區方法

    下面是一個實例,要求根據 key 值的最后一位數字將 key 寫入到不同的文件中,比如,10 寫入到 part-00000,11 寫入到 part-00001,12 寫入到 part-00002。打開一個 Linux 終端,使用 vim 編輯器創建一個代碼文件“/root/Desktop/luozhongye/TestPartitioner.py”,輸入以下代碼:

    from pyspark import SparkConf, SparkContextdef MyPartitioner(key):print("MyPartitioner is running")print('The key is %d' % key)return key % 10def main():print("The main function is running")conf = SparkConf().setMaster("local").setAppName("MyApp")sc = SparkContext(conf=conf)data = sc.parallelize(range(10), 5)data.map(lambda x: (x, 1)).partitionBy(10, MyPartitioner).map(lambda x: x[0]).saveAsTextFile("file:///root/Desktop/luozhongye/partitioner")if __name__ == '__main__':main()

使用如下命令運行 TestPartitioner.py:

cd /root/Desktop/luozhongye
python3 TestPartitioner.py

或者,使用如下命令運行 TestPartitioner.py:

cd /root/Desktop/luozhongye
spark-submit TestPartitioner.py

程序運行后會返回如下信息:

image-20231123114351343

3.文件數據寫入
  • 把 RDD 寫入到文本文件中
textFile = sc.textFile("file:///root/Desktop/luozhongye/wordlzy.txt") 
textFile.saveAsTextFile("file:///root/Desktop/luozhongye/writeback")

其中wordlzy.txt的內容

Hadoop is good
Spark is fast
Spark is better
luozhongye is handsome

image-20231123115053912

Spark 采用惰性機制。可以使用如下的“行動”類型的操作查看 textFile 中的內容:

textFile.first()

正因為 Spark 采用了惰性機制,在執行轉換操作的時候,即使輸入了錯誤的語句,pyspark 也不會馬上報錯,而是等到執行“行動”類型的語句啟動真正的計算時,“轉換”操作語句中的錯誤才會顯示出來,比如:

textFile = sc.textFile("file:///root/Desktop/luozhongye/wordcount/word123.txt")

image-20231123115210529

  • 把 RDD 寫入到文本文件中

可以使用 saveAsTextFile()方法把 RDD 中的數據保存到文本文件中。下面把 textFile 變量中的內容再次寫回到另外一個目錄 writeback 中,命令如下:

textFile = sc.textFile("file:///root/Desktop/luozhongye/wordlzy.txt") 
textFile.saveAsTextFile("file:///root/Desktop/luozhongye/writeback")

進入到“/root/Desktop/luozhongye/writeback”目錄查看

cd /root/Desktop/luozhongye/writeback
ls

image-20231123115411983

二、逐行理解并運行4.4.2實例“文件排序”。

新建多個txt文件file1.txt 、file2.txt 、file3.txt ,其內容分別如下:

33
37
12
40
4
16
39
5
1
45
25

要求讀取所有文件中的整數,進行排序后,輸出到一個新的文件中,輸出的內容為每行兩個整數,第一個整數為第二個整數的排序位次,第二個整數為原待排序的整數。

實現上述功能的代碼文件“/root/Desktop/luozhongye/FileSort.py”的內容如下:

#!/usr/bin/env python3 
from pyspark import SparkConf, SparkContextindex = 0def getindex():global indexindex += 1return indexdef main():conf = SparkConf().setMaster("local[1]").setAppName("FileSort")sc = SparkContext(conf=conf)lines = sc.textFile("file:///root/Desktop/luozhongye/file*.txt")index = 0result1 = lines.filter(lambda line: (len(line.strip()) > 0))result2 = result1.map(lambda x: (int(x.strip()), ""))result3 = result2.repartition(1)result4 = result3.sortByKey(True)result5 = result4.map(lambda x: x[0])result6 = result5.map(lambda x: (getindex(), x))result6.foreach(print)result6.saveAsTextFile("file:///root/Desktop/luozhongye/sortresult")if __name__ == '__main__':main()

image-20231123232005765

三、完成p96實驗內容3,即“編寫獨立應用程序實現求平均值問題”,注意每位同學自己修改題目中的數據。

每個輸入文件表示班級學生某個學科的成績,每行內容由兩個字段組成,第一個字段是學生名字,第二個字段是學生的成績;編寫 Spark 獨立應用程序求出所有學生的平均成績,并輸出到一個新文件中。

數學成績.txt:

小羅 110
小紅 107
小新 100
小麗 99

英語成績.txt:

小羅 95 
小紅 81 
小新 82
小麗 76

政治成績.txt:

小羅 65 
小紅 71 
小新 61 
小麗 66

408成績.txt:

小羅 100
小紅 103
小新 94
小麗 110

實現代碼如下:

from pyspark import SparkConf, SparkContext# 初始化Spark配置和上下文
conf = SparkConf().setAppName("AverageScore")
sc = SparkContext(conf=conf)# 讀取數學成績文件
math_rdd = sc.textFile("數學成績.txt").map(lambda x: (x.split()[0], int(x.split()[1])))# 讀取英語成績文件
english_rdd = sc.textFile("英語成績.txt").map(lambda x: (x.split()[0], int(x.split()[1])))# 讀取政治成績文件
politics_rdd = sc.textFile("政治成績.txt").map(lambda x: (x.split()[0], int(x.split()[1])))# 讀取408成績文件
computer_rdd = sc.textFile("408成績.txt").map(lambda x: (x.split()[0], int(x.split()[1])))# 合并所有成績數據
all_scores_rdd = math_rdd.union(english_rdd).union(politics_rdd).union(computer_rdd)# 計算每個學生的成績總和和成績數量
sum_count_rdd = all_scores_rdd.combineByKey(lambda value: (value, 1),lambda acc, value: (acc[0] + value, acc[1] + 1),lambda acc1, acc2: (acc1[0] + acc2[0], acc1[1] + acc2[1]))# 計算平均成績
average_scores_rdd = sum_count_rdd.mapValues(lambda x: x[0] / x[1])# 輸出到新文件
average_scores_rdd.saveAsTextFile("平均成績")# 關閉Spark上下文
sc.stop()

image-20231123233508387

實驗心得

在這次實驗中,我進一步熟悉了使用PySpark進行大數據處理和分析的方法,并深入了解了PySpark RDD的基本操作。學會了分區、持久化、數據寫入文件,并解決實際問題。這次實驗讓我對PySpark有了更深入的理解,并增強了我處理和分析大數據的能力。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/165570.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/165570.shtml
英文地址,請注明出處:http://en.pswp.cn/news/165570.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Redis入門教程

1. 什么是NoSql NoSQL一詞最早出現于1998年,是Carlo Strozzi開發的一個輕量、開源、不提供SQL功能的關系數據庫。2009年,Last.fm的Johan Oskarsson發起了一次關于分布式開源數據庫的討論,來自Rackspace的Eric Evans再次提出了NoSQL的概念&am…

onnx導出報錯 | IndexError: index_select(): Index is supposed to be a vector

解決方案: 在torch.onnx.export鐘添加do_constant_foldingFalse,如下 torch.onnx.export(model,(None, text),text_fp32_onnx_path,input_names[text],output_names[unnorm_text_features],export_paramsTrue,opset_version13,verboseTrue,do_constant_…

編程參考 - C++ Code Review: 一個計算器的項目

GitHub - jroelofs/calc: Toy Calculator Toy Calculator 1,拿到一個project,第一眼看,沒有配置文件,說明沒有引入持續集成系統,continuous integration system。 2,然后看cmake文件,使用的子…

使用Python的turtle模塊繪制鋼鐵俠圖案

1.1引言: 在Python中,turtle模塊是一個非常有趣且強大的工具,它允許我們以一個可視化和互動的方式學習編程。在本博客中,我們將使用turtle模塊來繪制鋼鐵俠的圖案。通過調用各種命令,我們可以引導turtle繪制出指定的圖…

第十四章 控制值的轉換 - 在DISPLAYLIST中投影值

文章目錄 第十四章 控制值的轉換 - 在DISPLAYLIST中投影值在DISPLAYLIST中投影值 第十四章 控制值的轉換 - 在DISPLAYLIST中投影值 在DISPLAYLIST中投影值 對于 %String 類型(或任何子類)的屬性,XML 投影可以使用 DISPLAYLIST 參數。 簡單…

CrystalDiskInfo/CrystalDiskMark/DiskGenius系統遷移

CrystalDiskInfo 主要用于看硬盤的各種信息,包括但不限于硬盤通電時間、通電次數、硬盤好壞狀態 CrystalDiskMark 主要用于測試硬盤的讀寫速度、連續讀寫速度 DiskGenius 主要用于通過U盤裝操作系統后進行,磁盤分區,更改磁盤名、隱藏部分…

【前端知識】Node——http模塊url模塊的常用操作

一、創建簡易Server const http require(http); const URL require(url);const HTTP_PORT 8088;const server http.createServer((req, res) > {// req:request請求對象,包含請求相關的信息;// res:response響應對象&…

【MISRA C 2012】Rule 5.2 在同一作用域和名稱空間中聲明的標識符應該是不同的

1. 規則1.1 原文1.2 分類 2. 關鍵描述3. 代碼實例 1. 規則 1.1 原文 Rule 5.2 Identifiers declared in the same scope and name space shall be distinct Category Required Analysis Decidable, Single Translation Unit Applies to C90, C99 1.2 分類 規則4.2&#xff…

案例014:Java+SSM+uniapp+mysql基于微信小程序的健身管理系統

文末獲取源碼 開發語言:Java 框架:SSM JDK版本:JDK1.8 數據庫:mysql 5.7 開發軟件:eclipse/myeclipse/idea Maven包:Maven3.5.4 小程序框架:uniapp 小程序開發軟件:HBuilder X 小程序…

【機器學習 | ARIMA】經典時間序列模型ARIMA定階最佳實踐,確定不來看看?

🤵?♂? 個人主頁: AI_magician 📡主頁地址: 作者簡介:CSDN內容合伙人,全棧領域優質創作者。 👨?💻景愿:旨在于能和更多的熱愛計算機的伙伴一起成長!!&…

SpringBoot:ch02 配置文件(日志)

前言 簡單介紹 Spring Boot 中常見的配置文件類型&#xff0c;如 application.properties 和 application.yml 等&#xff0c;并說明它們各自的特點和用途。 一、前期準備 1、新建項目&#xff0c;結構如下 2、添加依賴 <?xml version"1.0" encoding"UTF…

單片機語音芯片開發要解決的問題

在單片機語音芯片開發過程中&#xff0c;可能會遇到多種問題&#xff0c;這些問題可能來自于技術層面&#xff0c;也可能來自于芯片本身的設計和應用層面。下面讓我們具體從芯片的功耗、語音識別的準度、芯片的尺寸和芯片的可靠性四個方面開展討論。 1.芯片的功耗問題 首先&a…

【AIGC重塑教育】AI大爆發的時代,未來的年輕人怎樣獲得機會和競爭力?

目錄 AI浪潮來襲 AI與教育 AI的優勢 延伸閱讀 推薦語 ?作者&#xff1a;劉文勇 來源&#xff1a;IT閱讀排行榜 本文摘編自《AIGC重塑教育&#xff1a;AI大模型驅動的教育變革與實踐》&#xff0c;機械工業出版社出版 AI浪潮來襲 這次&#xff0c;狼真的來了。 AI正迅猛地…

81基于matlab GUI的圖像處理

基于matlab GUI的圖像處理&#xff0c;功能包括圖像顏色處理&#xff08;灰度圖像、二值圖像、反色變換、直方圖、拉伸變換&#xff09;&#xff1b;像素操作&#xff08;讀取像素、修改像素&#xff09;、平滑濾波&#xff08;均值平滑、高斯平滑、中值平滑&#xff09;、圖像…

Java多線程之線程安全問題

文章目錄 一. 線程安全概述1. 什么是線程安全問題2. 一個存在線程安全問題的程序 二. 線程不安全的原因和線程加鎖1. 案例分析2. 線程加鎖2.1 理解加鎖2.2 synchronized的使用2.3 再次分析案例 3. 線程不安全的原因 三. 線程安全的標準類 一. 線程安全概述 1. 什么是線程安全問…

基于C#實現赫夫曼樹

赫夫曼樹又稱最優二叉樹&#xff0c;也就是帶權路徑最短的樹&#xff0c;對于赫夫曼樹&#xff0c;我想大家對它是非常的熟悉&#xff0c;也知道它的應用場景&#xff0c;但是有沒有自己親手寫過&#xff0c;這個我就不清楚了&#xff0c;不管以前寫沒寫&#xff0c;這一篇我們…

【LeetCode刷題筆記】DFSBFS(二)

994. 腐爛的橘子(樹/圖的BFS問題) 解題思路: 多源BFS ,首選找到 所有的腐爛的橘子 ,放入隊列中,然后進行 BFS 廣搜,廣搜的 層數 - 1 就是所需要花費的分鐘數。 在最開始先掃描一遍二維數組,將所有的 腐爛的橘子 加入 隊列 ,同時統計新鮮橘子的數量 <

Blender烘焙AO操作及對應的python代碼

&#xff08;一&#xff09;Blender軟件操作 1. 導入模型&#xff08;這里省略&#xff09; 2. 材質設置 模型使用的所有材質都需要刪除Surface Shader&#xff0c;沒有其他多余的計算&#xff0c;可以大量縮短烘焙時間。刪除之后的只留下一個材質輸出節點&#xff0c;如圖所…

CentOS Stream 9系統Cgroup問題處理

安裝docker容器啟動失敗 之前適配過Ubuntu系統的容器&#xff0c;由于版本比較高&#xff0c;沒有掛載Cgroup的路徑。這次使用Centos Stream 9系統安裝docker容器時也遇到了這個情況。由于處理方式有些不一樣&#xff0c;所以記錄一下。 這是docker容器啟動過報錯的輸出日志。…