浅谈PyODPS
摘要: 在我看來(lái),PyODPS就是阿里云上的Python。值得注意的是,這里的定語(yǔ)“阿里云上的”一定不能精簡(jiǎn)掉,因?yàn)镻yODPS不等于單機(jī)版的Python!
點(diǎn)此查看原文
目錄
我眼中的PyODPS
安裝和升級(jí)PyODPS版本
PyODPS的牛刀小試
未來(lái)更精彩
1. 我眼中的PyODPS
簡(jiǎn)單來(lái)說(shuō),PyODPS就是在MaxCompute中用編程語(yǔ)言的方式對(duì)存儲(chǔ)在阿里云DataWorks上的數(shù)據(jù)表作數(shù)據(jù)預(yù)處理和機(jī)器學(xué)習(xí)的Python API。好像還是有點(diǎn)啰嗦,再精簡(jiǎn)一下,PyODPS就是阿里云上的Python。值得注意的是,這里的定語(yǔ)“阿里云上的”一定不能精簡(jiǎn)掉,因?yàn)镻yODPS不等于單機(jī)版的Python!就像是在Spark平臺(tái)上的PySpark不等于單機(jī)版的Python一樣。在表面上看,一個(gè)很大的區(qū)別就是單機(jī)版的Python語(yǔ)言只能在單機(jī)上做數(shù)據(jù)處理和機(jī)器學(xué)習(xí),但是PyODPS和PySpark一樣,都是在集群上做數(shù)據(jù)處理和機(jī)器學(xué)習(xí)的。而我更愿意從編程語(yǔ)言的角度去看待PyODPS,就像Clojure, Common Lisp, Elisp, Scheme等被稱為是Lisp編程語(yǔ)言的不同方言一樣,我更喜歡把PyODPS和PySpark理解成是Python的方言。雖然這樣理解很不嚴(yán)謹(jǐn),因?yàn)楫吘筆yODPS和PySpark都分別需要在連接阿里云的本地PC和Spark平臺(tái)中的各節(jié)點(diǎn)上預(yù)先安裝Python。之所以突出強(qiáng)調(diào)這一不同點(diǎn),就是想讓大家提前留意到在使用PyODPS處理阿里云上的數(shù)據(jù)表和建模時(shí),很多編程的語(yǔ)法是與單機(jī)版Python不同的。例如下面這樣一個(gè)讀取本地文件的簡(jiǎn)單使用場(chǎng)景中,PyODPS與單機(jī)版Python的語(yǔ)法就不相同。
使用單機(jī)版Python讀取本地文件
使用PyODPS讀取本地文件
這只是一個(gè)很簡(jiǎn)單的區(qū)別,在實(shí)際的工作中還會(huì)有許多語(yǔ)法上不同的地方,等待大家去發(fā)現(xiàn),去體會(huì)。不過(guò)先要有將PyODPS與單機(jī)版Python區(qū)分開(kāi)的意識(shí),有了這樣的意識(shí),在上云過(guò)程中,如果將之前本地機(jī)器上處理數(shù)據(jù)庫(kù)或數(shù)據(jù)表的單機(jī)版Python代碼移植進(jìn)PyODPS中,輸出結(jié)果出現(xiàn)異常或者發(fā)生報(bào)錯(cuò)時(shí),就會(huì)考慮先從代碼語(yǔ)法層面去排查問(wèn)題,之后再查找ETL等其他可能的原因。而且有了這樣的意識(shí)之后,也會(huì)自覺(jué)編寫符合PyODPS語(yǔ)法的代碼,從而更加有效的利用MaxCompute卓越的計(jì)算性能。
提起與底層平臺(tái)計(jì)算性能相關(guān)話題的時(shí)候,我總是感觸良多。按照我上述不太嚴(yán)謹(jǐn)?shù)恼f(shuō)法,PyODPS與PySpark雖然都能稱作是Python的兩門方言,但是他們所依托的平臺(tái)真的是有親娘跟后媽的天壤之別!我由于工作需要,所以在阿里云上的項(xiàng)目和本地集群的項(xiàng)目都有參與,才讓我有了親娘和后媽這兩種反差很大的用戶體驗(yàn)。
還是先從讓人心情愉悅的這個(gè)說(shuō)起吧。PyODPS,我們的主角,阿里云的MaxCopute對(duì)PyODPS來(lái)說(shuō),簡(jiǎn)直就像親娘一樣,無(wú)微不至的關(guān)懷,全心全意的支持。使用PyODPS的感覺(jué)就是一個(gè)字:省心!只要你連接阿里云的這臺(tái)PC上預(yù)先安裝了Python,無(wú)論你安裝的是Python2還是Python3,只要使用命令行終端,輸入“pip install pyodps”命令便可安裝PyODPS。之后在你喜歡使用的任意一款Python IDE中(我比較喜歡的是Jupyter Notebook)輸入以下命令就可以直接使用MaxCompute平臺(tái)了。一切就是這么自然!
from odps import ODPS o = ODPS(access_id='$$$$$$$$$$$$$$ ', secret_access_key='*********************', project='xxx', end_point='https://service.odps.aliyun.com/api')而且PyODPS的版本更新完全向下兼容,只要在新版本推出之后,用本地PC的命令行終端,輸入“pip install -U pyodps”命令更新版本就行了。完全不用考慮任何版本兼容問(wèn)題!而且PyODPS的操作指南也會(huì)在以下網(wǎng)址同步更新。真的是省時(shí)、省力又省心!
http://pyodps.readthedocs.io/zh_CN/latest/index.html
那么,PySpark的用戶體驗(yàn)又是怎樣的呢?一句話:小孩沒(méi)娘,說(shuō)來(lái)話長(zhǎng)……先從版本說(shuō)起吧,從各家企業(yè)使用服務(wù)器的Linux操作系統(tǒng)開(kāi)始,版本就開(kāi)始各不相同了,單就CentOS操作系統(tǒng)來(lái)說(shuō),我見(jiàn)過(guò)的企業(yè)就有用CentOS6.4,CentOS6.5,CentOS6.6和CentOS7.2的,這些系統(tǒng)自帶的Python2和jdk的版本也都不相同,在拿到這些系統(tǒng)之后,第一件事就是升級(jí)jdk到j(luò)dk8和將Python2.x升級(jí)到Python2.7.13。之后就是選擇Hadoop,Spark,Zookeeper,Hive,HBase,Kafka等組件以及Zeppelin等Notebook的版本。
選擇完這一大堆組件的版本之后,就開(kāi)始了安裝部署、更改配置、更新依賴包的慢慢征途了。這期間要天天纏著谷哥和度娘問(wèn)各種各樣的部署、配置和依賴問(wèn)題,而且經(jīng)常要在各種回答中反復(fù)試錯(cuò)N遍之后才能找到一個(gè)問(wèn)題的正解。單就一個(gè)在Zeppelin Notebook運(yùn)行PySpark時(shí)出現(xiàn)空指針報(bào)錯(cuò)的問(wèn)題,就耗費(fèi)了我好幾天的時(shí)間,而且到現(xiàn)在還沒(méi)有徹底解決。怎一個(gè)心酸了得……
經(jīng)過(guò)了漫長(zhǎng)的平臺(tái)搭建之路,終于到了PySpark登臺(tái)亮相的時(shí)候了,結(jié)果這時(shí)才發(fā)現(xiàn),用PySpark在Spark這個(gè)后媽的平臺(tái)上工作,還是前路坎坷。就連Spark官網(wǎng)上的PySpark代碼,都時(shí)常有跑不通的情況發(fā)生。我還記得當(dāng)時(shí)要把從HBase中讀取的RDD格式數(shù)據(jù)轉(zhuǎn)換成DataFrame時(shí),官網(wǎng)上的PySpark語(yǔ)句是跑不通的,在谷哥和度娘上查到的語(yǔ)句也都跑不通,最后我花了大概兩天的時(shí)間才把這個(gè)功能跑通,當(dāng)時(shí)那種深深的絕望和絕處逢生的喜悅,讓我至今仍記憶猶新。單是Spark官網(wǎng)上PySpark代碼跑不通的問(wèn)題,我還可以理解為可能是由于版本不兼容問(wèn)題造成的。可是之后這個(gè)問(wèn)題,就真的是明目張膽的后媽行為了。到了Spark的Datasets數(shù)據(jù)結(jié)構(gòu),以及圖計(jì)算部分的GraphX,完全拋棄了PySpark,就只剩下她的親兒子Scala了。這還能不能過(guò)了?
每當(dāng)這個(gè)時(shí)候,我都會(huì)想起和PyODPS一同奮戰(zhàn)的崢嶸歲月。只要兩句話,他就會(huì)把整個(gè)MaxCompute集團(tuán)都拉過(guò)來(lái)跟你一起干,在你迷茫或找不準(zhǔn)方向的時(shí)候,釘釘群(群名稱: PyODPS 技術(shù)支持,群號(hào): 11701793)里的專家和軍師們會(huì)為你指點(diǎn)迷津,與你一同并肩在PB甚至是TB量級(jí)的各種海量數(shù)據(jù)戰(zhàn)場(chǎng)上殺出一條血路!一條勝利之路!這,就是我眼中的PyODPS!
2. 安裝和升級(jí)PyODPS版本
2-1. 安裝
PyODPS對(duì)Python2和Python3版本都是兼容的。這里我推薦安裝Anaconda的Python2或者Python3,因?yàn)榘惭bAnaconda時(shí),會(huì)默認(rèn)安裝許多Python常用的第三方庫(kù),免去你后續(xù)查找和安裝各個(gè)第三方庫(kù)的煩惱,而且Anaconda中安裝的Jupyter Notebook正是我使用PyODPS時(shí)非常順手的編輯器,另外Anaconda的Spyder也是非要好用的Python代碼編輯器。
使用命令行終端,輸入“pip install pyodps”命令即可完成安裝。如下圖所示。
2-2. 升級(jí)
使用命令行終端,輸入“pip install -U pyodps”即可完成升級(jí)。如下圖所示。
3. PyODPS的牛刀小試
當(dāng)數(shù)據(jù)表存儲(chǔ)到DataWorks之后,PyODPS就可以對(duì)表中的數(shù)據(jù)進(jìn)行數(shù)據(jù)預(yù)處理了。這里以一份1993年Auto MPG Data Set開(kāi)源數(shù)據(jù)集為例,做一個(gè)簡(jiǎn)單的Demo。(此數(shù)據(jù)集的下載地址為:http://archive.ics.uci.edu/ml/datasets/Auto+MPG)
前提是我們已經(jīng)將此數(shù)據(jù)集導(dǎo)入到DataWorks當(dāng)中,之后操作PyODPS做數(shù)據(jù)處理和機(jī)器學(xué)習(xí)的具體姿勢(shì)如下:
3-1. 通過(guò)PyODPS,從DataWorks中讀入數(shù)據(jù)表,并轉(zhuǎn)換成DataFrame格式。如下圖所示。從圖中我們可以看到,使用的是最新版0.7.13版本的PyODPS,并且讀入的數(shù)據(jù)表有398條記錄。
3-2. 查看數(shù)據(jù)表。如下兩圖所示。從這兩張圖中,我們可以看到這張表共有9列字段,并且在“horsepower”字段中出現(xiàn)了以問(wèn)號(hào)填充的臟數(shù)據(jù)。這是我們要首先去除掉的。
3-3. 去除“horsepower”字段中的問(wèn)號(hào),并查看處理臟數(shù)據(jù)后DataFrame的各字段類型。如下圖所示。這里,在查看字段類型時(shí),發(fā)現(xiàn)由于問(wèn)號(hào)臟數(shù)據(jù)的出現(xiàn),導(dǎo)致“horsepower”字段的類型目前為“string”類型。不過(guò)也不用著急將這個(gè)字段變回整數(shù)類型,可以往下再做一些其他的數(shù)據(jù)處理工作,如果發(fā)現(xiàn)有其他字段也需要調(diào)整類型的時(shí)候,可以在訓(xùn)練模型之前,一并處理。
3-4. 分組、聚合、排序操作。如下圖所示。這里是按照一輛汽車安裝汽缸的數(shù)量進(jìn)行分組;并按照不同汽缸個(gè)數(shù),求汽車燃油效率(以耗費(fèi)一加侖汽油行駛的英里數(shù)作為表征,即mpg字段)的最大值和最小值,以及對(duì)裝有不同汽缸數(shù)量的汽車進(jìn)行計(jì)數(shù);最后按照單輛汽車汽缸的個(gè)數(shù)進(jìn)行降序排列。從下圖的輸出結(jié)果中可以看到,并不是汽缸的數(shù)量越多,燃油效率就越高,裝有4汽缸汽車的燃油效率要高于裝有8汽缸的汽車。并且,此表中裝有4汽缸和8汽缸的數(shù)據(jù)記錄較多,其他3款的數(shù)據(jù)記錄偏少。由此可知,我們可以將汽缸數(shù)量為3,5,6的數(shù)據(jù)記錄去除,將此表構(gòu)造成可用于二分類算法模型使用的數(shù)據(jù)表。
3-5. 依次去除汽缸數(shù)量為3,5,6的數(shù)據(jù)記錄,并驗(yàn)證剩余數(shù)據(jù)記錄條數(shù)。如下圖所示。
3-6. 將“horsepower”字段類型裝換為整數(shù)型,并去除字符串類型字段car_name。如下圖所示。
3-7. 設(shè)置字段連續(xù)性并標(biāo)注標(biāo)簽字段。如下圖所示。
3-8. 歸一化,并劃分訓(xùn)練集和測(cè)試集。如下圖所示。
3-9. 檢查訓(xùn)練集和測(cè)試集的字段類型及屬性標(biāo)識(shí)。如下圖所示。
3-10. 使用訓(xùn)練集訓(xùn)練邏輯回歸模型,并用此模型對(duì)測(cè)試集進(jìn)行預(yù)測(cè)。如下圖所示。
3-11. 查看邏輯回歸模型對(duì)測(cè)試集的預(yù)測(cè)結(jié)果及評(píng)分。如下圖所示。
3-12. 計(jì)算此邏輯回歸模型的評(píng)分及混淆矩陣。如下3圖所示。
至此,一輪簡(jiǎn)單的使用PyODPS進(jìn)行數(shù)據(jù)處理及機(jī)器學(xué)習(xí)的完整過(guò)程就演示完畢了。這里要說(shuō)明的一點(diǎn)是,雖然這個(gè)模型把測(cè)試集中91條記錄全部預(yù)測(cè)正確了,但是這并不是個(gè)好消息,反而暴露出由于數(shù)據(jù)樣本過(guò)少而導(dǎo)致這個(gè)模型存在嚴(yán)重的過(guò)擬合現(xiàn)象。不過(guò)這只是一個(gè)簡(jiǎn)單地Demo,重在演示使用PyODPS的姿勢(shì),而且我個(gè)人賬號(hào)中的余額也不多,就不再增加數(shù)據(jù)樣本了。值得注意的是,在實(shí)際的工作中,訓(xùn)練模型所使用的樣本數(shù)據(jù)的數(shù)量和質(zhì)量是非常重要的,而數(shù)據(jù)預(yù)處理和特征工程才決定著算法模型上限的關(guān)鍵步驟。在數(shù)據(jù)處理這部分,PyODPS依托于MaxCompute平臺(tái)強(qiáng)大的計(jì)算性能,就體現(xiàn)出非常大的優(yōu)勢(shì)啦。
4. 未來(lái)更精彩
啰嗦了這么多,希望大家通過(guò)這一輪簡(jiǎn)單的演示,能對(duì)PyODPS的數(shù)據(jù)處理能力有一個(gè)大概的印象,在以后的工作中,能日漸熟練的使用它來(lái)處理你的海量數(shù)據(jù)。
2017年12月20日,在北京云棲大會(huì)上,阿里云MaxCompute發(fā)布了最新的功能Python UDF,目前已經(jīng)進(jìn)入公測(cè)階段(詳情見(jiàn)此鏈接https://yq.aliyun.com/articles/292672)。隨著即將到來(lái)的Python UDF在MaxComputer平臺(tái)上的全面開(kāi)放,我相信PyODPS會(huì)在阿里云上的綻放出更加耀眼的光芒,將成為你在阿里云上不可多得的得力助手!
貼心的操作指南也已經(jīng)同步上線,教大家如何在PyODPS中使用Python UDF。詳見(jiàn)如下網(wǎng)址:https://yq.aliyun.com/articles/292672
此時(shí),你已經(jīng)站在PyODPS的大門口,門后就是阿里云MaxCompute的繽紛世界。我突然想套用papi醬的一句名言,就是:……
你還不推一下啊!
總結(jié)
- 上一篇: 深度学习之优化详解:batch norm
- 下一篇: 通用智能传感集线器(Sensorhub)