全部產品
Search
文件中心

MaxCompute:PyODPS DataFrame自訂函數中使用第三方包

更新時間:May 28, 2026

本文向您介紹如何在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.zipsix-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-2.6.0.zip

python-dateutil.zip

pytz

pytz-2017.2.zip

pytz.zip

six

six-1.11.0.tar.gz

six.tar.gz

pandas

pandas-0.20.2-cp27-cp27m-manylinux1_x86_64.zip

pandas.zip

scipy

scipy-0.19.0-cp27-cp27m-manylinux1_x86_64.zip

scipy.zip

scikit-learn

scikit_learn-0.18.1-cp27-cp27m-manylinux1_x86_64.zip

sklearn.zip

說明

您也可以使用PyODPS的資源上傳介面來完成資源的上傳,同樣只需操作一遍。

編寫代碼驗證

  1. 寫一個簡單的函數,裡面用到所有的庫,最好是在函數中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
    說明

    上述代碼只是樣本,目標是用到上文所說的所有的包。

  2. 寫完函數後,寫一個簡單的map。

    說明

    運行時要確保開啟isolation,如果在project層級沒有開啟,也可在運行時開啟一個可以設定全域的選項。

    from odps import options
    
    options.sql.settings = {'odps.isolation.session.enable': True}

    您也可以在execute方法上指定本次執行開啟isolation。

    同樣,您可以在全域通過options.df.libraries指定用到的包,也可以在execute時指定。這裡需要指定所有的包,包括依賴。

  3. 調用定義的函數。

    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相關資源