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