PyODPS DataFrame 的代码在哪里跑
在使用 PyODPS DataFrame 編寫數(shù)據(jù)應(yīng)用時,盡管編寫的是同一個腳本文件,但其中的代碼會在不同位置執(zhí)行,這可能導(dǎo)致一些無法預(yù)期的問題,本文介紹當(dāng)出現(xiàn)相關(guān)問題時,如何確定代碼在何處執(zhí)行,以及提供部分場景下解決問題的方法。
概述
假定我們要執(zhí)行下面的代碼:
from odps import ODPS, options import numpy as npo = ODPS(access_id, access_key, project, endpoint) df = o.get_table('pyodps_iris').to_df()coeffs = [0.1, 0.2, 0.4]def handle(v):import numpy as npreturn float(np.cosh(v)) * sum(coeffs)options.df.supersede_libraries = True val = df.sepal_length.map(handle).sum().execute(libraries=['numpy.zip', 'other.zip']) print(np.sinh(val))復(fù)制代碼在開始分析之前,首先需要指出的是,PyODPS 是一個 Python 包而非 Python Implementation,PyODPS 的運行環(huán)境均為未經(jīng)修改的 Python,因而并不會出現(xiàn)與正常 Python 解釋器不一致的行為。亦即,你所寫的每一條語句不會有與標(biāo)準(zhǔn) Python 語句不同的行為,例如自動變成分布式代碼,等等。
下面解釋該代碼的執(zhí)行過程。
上圖是執(zhí)行上述代碼時可能涉及的系統(tǒng)。代碼本身執(zhí)行的位置在圖中用紫色表示,這些系統(tǒng)都位于 MaxCompute 外部,為了方便表述,下文稱為“本地”。在本地執(zhí)行的代碼包括 handle 函數(shù)之外的部分(注意 handle 傳入 map 時僅傳入了函數(shù)本身而并未執(zhí)行)。因而,這些代碼在執(zhí)行時,行為與普通 Python code 的執(zhí)行行為類似,import 第三方包時,引用的是本地的包。因而,上面的代碼中,libraries=['numpy.zip', 'other.zip']引用的other.zip因為并沒有在本地安裝,因而如果代碼中有諸如 import other 這樣的語句,會導(dǎo)致執(zhí)行報錯。即便 other.zip 已被上傳到 MaxCompute 資源也是如此,因為本地根本沒有這個包。理論上,本地代碼如果不涉及 PyODPS 包,則與 PyODPS 無關(guān),用戶需要自行排查。
對于 handle 函數(shù),情況發(fā)生了變化。handle 函數(shù)傳入 map 方法時,如果使用的后端是 MaxCompute 后端,會先被 cloudpickle 模塊提取閉包和字節(jié)碼,此后 PyODPS DataFrame 會使用閉包和字節(jié)碼生成一個 Python UDF,提交到 MaxCompute。最后,作業(yè)以 SQL 的形式在 MaxCompute 執(zhí)行時,會調(diào)用這個 Python UDF,其中的字節(jié)碼和閉包內(nèi)容會被 unpickle,此后在 MaxCompute Executor 執(zhí)行。由此可見,在上述代碼中,
上述對 handle 函數(shù)的解釋對于自定義聚合、apply 和 map_reduce 中調(diào)用的自定義方法 / Agg 類均適用。如果使用的后端是 Pandas 后端,則所有代碼都會在本地運行,因而本地也需要安裝相關(guān)的包。但鑒于 Pandas 后端調(diào)試完畢后通常會轉(zhuǎn)移到 MaxCompute 運行,建議在本地裝包的同時,參照 MaxCompute 后端的慣例進行開發(fā)。
使用第三方包
在相應(yīng)的 Python 版本上安裝即可。
該部分功能由 DataWorks 提供,請參考 DataWorks 文檔。
參考 yq.aliyun.com/articles/59… 。需要補充的是,在 DataWorks 上上傳資源后,需要點擊“提交”確保資源被正確上傳到 MaxCompute。如果需要使用自己的 Numpy 版本,在上傳正確版本的 wheel 包的同時,需要配置 odps.df.supersede_libraries = True,同時確保你上傳的 numpy 包名位于 libraries 的最前面,如果指定了 options.df.libraries,則 numpy 包名需要位于 options.df.libraries 的最前面。
引用其他 MaxCompute 表中的數(shù)據(jù)
如果 Endpoint 可以連接,使用 PyODPS / DataFrame 訪問。
MaxCompute Executor 中通常不支持訪問 Endpoint / Tunnel Endpoint,其上也沒有 PyODPS 包可用,因而不能直接使用 ODPS 入口對象或者 PyODPS DataFrame,也不能從自定義函數(shù)外部傳入這些對象。如果表的數(shù)據(jù)量不大,建議將 DataFrame 作為資源傳入(見 pyodps.readthedocs.io/zh_CN/lates… )。如果數(shù)據(jù)量較大,建議改寫成 join。
訪問其他服務(wù)
保證自己的環(huán)境中可以正常訪問相關(guān)服務(wù),生產(chǎn)服務(wù)器可以聯(lián)系 PE。
請咨詢 DataWorks。
參考 yq.aliyun.com/articles/59… 啟用 Isolation,如果仍然遇到網(wǎng)絡(luò)報錯,請聯(lián)系 MaxCompute 用戶群,找 PE 幫忙解決。
本文作者:繼盛
原文鏈接
本文為云棲社區(qū)原創(chuàng)內(nèi)容,未經(jīng)允許不得轉(zhuǎn)載。
轉(zhuǎn)載于:https://juejin.im/post/5cfe14abe51d45108c59a519
總結(jié)
以上是生活随笔為你收集整理的PyODPS DataFrame 的代码在哪里跑的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 红米k50稳了,关键参数曝光:与小米12
- 下一篇: 「常识」软巴乌当是什么