全部產品
Search
文件中心

:調試指南

更新時間:Feb 28, 2024

由於PyODPS DataFrame本身會對整個操作執行最佳化,為了更直觀地反應整個過程, 您可以使用可視化的方式顯示整個運算式的計算過程。

可視化DataFrame

可視化需要依賴graphviz軟體graphvizPython包。

>>> df = iris.groupby('name').agg(id=iris.sepalwidth.sum())
>>> df = df[df.name, df.id + 3]
>>> df.visualize()

由上圖可見,這個計算過程中,PyODPS DataFrame將groupby和列篩選做了操作合并。

>>> df = iris.groupby('name').agg(id=iris.sepalwidth.sum()).cache()
>>> df2 = df[df.name, df.id + 3]
>>> df2.visualize()

此時,由於執行了Cache操作,整個執行計畫將會分成兩步執行。

ODPS SQL後端查看編譯結果

您可以直接調用compile方法查看ODPS SQL後端編譯到SQL的結果。

>>> df = iris.groupby('name').agg(sepalwidth=iris.sepalwidth.max())
>>> df.compile()
Stage 1:

SQL compiled:

SELECT
  t1.`name`,
  MAX(t1.`sepalwidth`) AS `sepalwidth`
FROM test_pyodps_dev.`pyodps_iris` t1
GROUP BY
  t1.`name`

使用Pandas計算後端執行本地調試

對於來自ODPS表的DataFrame,部分操作不會編譯到ODPS SQL執行,而會使用Tunnel下載表資料。這個下載的過程很快,且無需等待ODPS SQL任務的調度。利用這個特性,您可以快速下載小部分ODPS資料到本地,使用Pandas計算後端進行代碼編寫和調試。這些操作包括:

  • 非分區表:對其進行選取全部或有限條資料、列篩選的操作(不包括列的各種計算),以及計算其數量。

  • 不選取分區或篩選前幾個分區欄位的分區表:對其選取全部或有限條資料、列篩選的操作,以及計算其數量。

例如iris這個DataFrame來自非分區表,以下操作會使用Tunnel進行下載。

>>> iris.count()
>>> iris['name', 'sepalwidth'][:10]

例如有個DataFrame來自分區表(有三個分區欄位,即dshhmm),以下操作會使用Tunnel下載。

>>> df[:10]
>>> df[df.ds == '20160808']['f0', 'f1']
>>> df[(df.ds == '20160808') & (df.hh == 3)][:10]
>>> df[(df.ds == '20160808') & (df.hh == 3) & (df.mm == 15)]

因此您可以使用to_pandas方法將部分資料下載到本地進行調試。

>>> DEBUG = True
>>> if DEBUG:
>>> df = iris[:100].to_pandas(wrap=True)
>>> else:
>>> df = iris

最後把DEBUG設定為False,便可以在ODPS上執行完整的計算。

說明

由於沙箱的限制,本地調試通過的程式不一定能在ODPS上也跑通。