PySpark——開啟大數(shù)據(jù)分析師之路
導(dǎo)讀
近日由于工作需要,突擊學(xué)了一下PySpark的簡(jiǎn)單應(yīng)用?,F(xiàn)分享其安裝搭建過(guò)程和簡(jiǎn)單功能介紹。

了解PySpark之前首先要介紹Spark。Spark,英文原義為火花或者星火,但這里并非此意,或者說(shuō)它就沒(méi)有明確的含義。實(shí)際上"名不副實(shí)"這件事在大數(shù)據(jù)生態(tài)圈各個(gè)組件中是很常見(jiàn)的,例如Hive(蜂巢),從名字中很難理解它為什么會(huì)是一個(gè)數(shù)倉(cāng),難道僅僅是因?yàn)槎伎捎糜诖鎯?chǔ)?
當(dāng)然,討論spark名字的含義并無(wú)意義,我們需要知道的是Spark是大數(shù)據(jù)生態(tài)圈中的一個(gè)分布式快速計(jì)算引擎,這其中包含了三層含義:分布式、快速、計(jì)算引擎。分布式意味著它支持多節(jié)點(diǎn)并行計(jì)算和備份;而快速則是相對(duì)Hadoop中的MapReduce計(jì)算框架而言,官網(wǎng)號(hào)稱速度差距是100倍;計(jì)算引擎則描述了Spark在大數(shù)據(jù)生態(tài)中定位:計(jì)算。
存儲(chǔ)和計(jì)算是大數(shù)據(jù)中的兩大核心功能。
大數(shù)據(jù)框架,一般離不開Java,Spark也不例外。不過(guò)Spark并非是用Java來(lái)寫的,而是用Scala語(yǔ)言。但考慮Scala語(yǔ)言建立在Java基礎(chǔ)之上,實(shí)際上Scala是可以直接調(diào)用Java的包的,所以從這點(diǎn)來(lái)講Spark歸根結(jié)底還是要依賴Java,自然環(huán)境依賴也需要JDK。也正是基于這些原因,Spark的主要開發(fā)語(yǔ)言就是Java和Scala。然后隨著數(shù)據(jù)科學(xué)的日益火爆,Python和R語(yǔ)言也日益流行起來(lái),所以Spark目前支持這4種語(yǔ)言。當(dāng)Spark遇到Python就變成了PySpark,這也是我們今天介紹的主角。
Spark目前最新版本是3.0,于今年6月16日正式發(fā)布release版。
一般而言,進(jìn)行大數(shù)據(jù)開發(fā)或算法分析需要依賴Linux環(huán)境和分布式集群,但PySpark支持local模式,即在本地單機(jī)運(yùn)行。所以,如果為了在個(gè)人PC上練習(xí)PySpark語(yǔ)法功能或者調(diào)試代碼時(shí),是完全可以在自己電腦上搭建spark環(huán)境的,更重要的windows系統(tǒng)也是可以的!

實(shí)際上,安裝PySpark非常簡(jiǎn)單,僅需像安裝其他第三方Python包一樣執(zhí)行相應(yīng)pip命令即可,期間pip會(huì)自動(dòng)檢測(cè)并補(bǔ)全相應(yīng)的工具依賴,如py4j,numpy和pandas等。這里py4j實(shí)際上是python for java的意思,是Python和java之間互調(diào)的接口,所以除了pip命令安裝PySpark之外還需配置系統(tǒng)的jdk環(huán)境,一般仍然是安裝經(jīng)典的JDK8版本,并檢查是否將java配置到系統(tǒng)環(huán)境變量。相應(yīng)的檢驗(yàn)方法是在cmd窗口中鍵入java -version,當(dāng)命令可以執(zhí)行并顯示正確的版本時(shí),說(shuō)明系統(tǒng)已完成java環(huán)境搭建。這是為PySpark運(yùn)行提供了基礎(chǔ)。

所以總結(jié)一下,安裝pyspark環(huán)境僅需執(zhí)行兩個(gè)步驟:
安裝JDK8,并檢查系統(tǒng)配備java環(huán)境變量
Pip命令安裝pyspark包
from?pyspark?import?SparkContext
sc?=?SparkContext()
rdd?=?sc.parallelize([1,?2])
rdd.getNumPartitions()
#?輸出4
Spark作為分布式計(jì)算引擎,主要提供了4大核心組件,它們之間的關(guān)系如下圖所示,其中GraphX在PySpark中暫不支持。

RDD(Resilient Distributed DataSet,彈性分布式數(shù)據(jù)集)是Spark中的核心數(shù)據(jù)結(jié)構(gòu)(Spark core),是完成分布式任務(wù)調(diào)度的關(guān)鍵,從名字縮寫中可以看出其有3大特性:彈性,意味著大小可變、分區(qū)數(shù)量可變;分布式,表示支持多節(jié)點(diǎn)并行處理;數(shù)據(jù)集,說(shuō)明這是一個(gè)特殊的數(shù)據(jù)結(jié)構(gòu)。
進(jìn)一步的,Spark中的其他組件依賴于RDD,例如:
SQL組件中的核心數(shù)據(jù)結(jié)構(gòu)是DataFrame,而DataFrame是對(duì)rdd的進(jìn)一步封裝。值得一提的是這里的DataFrame實(shí)際上和Pandas或者R語(yǔ)言的data.frame其實(shí)是很為相近的,語(yǔ)法、功能、接口都有很多共同之處,但實(shí)際上這里的DataFrame支持的接口要少的多,一定程度上功能相對(duì)受限;
Streaming組件中的核心數(shù)據(jù)結(jié)構(gòu)是Dstream,即離散流(discrete stream),本質(zhì)就是一個(gè)一個(gè)的rdd;
PySpark中目前存在兩個(gè)機(jī)器學(xué)習(xí)組件ML和MLlib,前者是推薦的機(jī)器學(xué)習(xí)庫(kù),支持的學(xué)習(xí)算法更多,基于SQL中DataFrame數(shù)據(jù)結(jié)構(gòu),而后者則是基于原生的RDD數(shù)據(jù)結(jié)構(gòu),包含的學(xué)習(xí)算法也較少
了解了這些,PySpark的核心功能和學(xué)習(xí)重點(diǎn)相信應(yīng)該較為了然。后續(xù)將不定期推出SQL和ML兩大組件的系列要點(diǎn)分享。

相關(guān)閱讀:
