本文向您介紹如何在PyODPS DataFrame自訂函數中上傳和使用pandas、scipy和scikit-learn第三方包。
PyODPS DataFrame提供了類似pandas的介面來操作MaxCompute資料,同時也支援在本地使用pandas和使用資料庫來執行。
PyODPS DataFrame不僅支援類似pandas的map和apply方法,也提供了MapReduce API來擴充pandas文法以適應巨量資料環境。
PyODPS的自訂函數是序列化到MaxCompute上執行,MaxCompute的Python環境僅包含numpy第三方包。現在,MaxCompute可以實現在自訂函數中使用pandas、scipy或scikit-learn等包含c代碼的庫。
PyODPS需要0.7.4及以上版本 。
上傳第三方包
您只需上傳一次第三方包,當MaxCompute資源有了這些包,可直接跳過此步。
現在主流的Python包都提供了whl包,提供了各平台包含二進位檔案的包,因此找到可以在MaxCompute上啟動並執行包是第一步。
其次,要想在MaxCompute上運行,需要包含所有的依賴包,這個是比較繁瑣的。各個包的依賴情況如下表所示。
包名 | 依賴 |
pandas | numpy,python-dateutil,pytz,six |
scipy | numpy |
scikit-learn | numpy,scipy |
其中numpy已包含,您只需上傳python-dateutil、pytz、pandas、scipy、sklearn、six包,pandas、scipy和scikit-learn即可使用。
您可進入python-dateutils找到python-dateutil-2.6.0.zip進行下載。
重新命名為python-dateutil.zip,通過MaxCompute Console上傳資源。
add archive python-dateutil.zip;pytz和six的上傳方式同上,分別找到 pytz-2017.2.zip和six-1.11.0.tar.gz進行下載和上傳資源操作。
對於pandas這種包含c的包,需要找到名字中包含cp27-cp27m-manylinux1_x86_64的whl包,這樣才能在MaxCompute上正確執行。因此,您需要找到pandas-0.20.2-cp27-cp27m-manylinux1_x86_64.whl進行下載,然後把尾碼改成zip,在MaxCompute Console中執行add archive pandas.zip;進行上傳。
其他包的操作同上,需下載資源如下表所示。
包名 | 檔案名稱 | 上傳資源名 |
python-dateutil | python-dateutil.zip | |
pytz | pytz.zip | |
six | six.tar.gz | |
pandas | pandas.zip | |
scipy | scipy.zip | |
scikit-learn | sklearn.zip |
您也可以使用PyODPS的資源上傳介面來完成資源的上傳,同樣只需操作一遍。
編寫代碼驗證
寫一個簡單的函數,裡面用到所有的庫,最好是在函數中import這些第三方庫。
def test(x): from sklearn import datasets, svm from scipy import misc import numpy as np iris = datasets.load_iris() assert iris.data.shape == (150, 4) assert np.array_equal(np.unique(iris.target), [0, 1, 2]) clf = svm.LinearSVC() clf.fit(iris.data, iris.target) pred = clf.predict([[5.0, 3.6, 1.3, 0.25]]) assert pred[0] == 0 assert misc.face().shape is not None return x說明上述代碼只是樣本,目標是用到上文所說的所有的包。
寫完函數後,寫一個簡單的map。
說明運行時要確保開啟isolation,如果在project層級沒有開啟,也可在運行時開啟一個可以設定全域的選項。
from odps import options options.sql.settings = {'odps.isolation.session.enable': True}您也可以在execute方法上指定本次執行開啟isolation。
同樣,您可以在全域通過options.df.libraries指定用到的包,也可以在execute時指定。這裡需要指定所有的包,包括依賴。
調用定義的函數。
hints = { 'odps.isolation.session.enable': True } libraries = ['python-dateutil.zip', 'pytz.zip', 'six.tar.gz', 'pandas.zip', 'scipy.zip', 'sklearn.zip'] iris = o.get_table('pyodps_iris').to_df() print iris[:1].sepal_length.map(test).execute(hints=hints, libraries=libraries)
總結
對於要用到的第三方庫及其依賴,如果已經上傳,可以直接編寫代碼,並指定用到的libraries即可。否則,需要按照上述操作上傳第三方庫。
PyODPS相關資源
相關文檔請參見PyODPS使用指南。
相關代碼請參見aliyun-odps-python-sdk。