Três ferramentas de depuração estão disponíveis, organizadas da mais leve para a mais complexa:
Visualizar o plano de execução — veja como o PyODPS otimiza e mescla suas operações antes da execução
Inspecionar o SQL compilado — verifique o SQL que o PyODPS gera para o backend MaxCompute SQL
Executar localmente com pandas — baixe uma pequena amostra e itere rapidamente sem agendar um job do MaxCompute
Visualizar o plano de execução
Visualizar o plano de execução antes de executar uma computação ajuda a identificar onde as operações são mescladas em um único estágio e onde existem limites explícitos entre estágios. Isso revela possíveis gargalos, como operações que não podem ser paralelizadas, antes que afetem jobs de produção.
Pré-requisitos: Instale o graphviz e o pacote Python graphviz.
Chame .visualize() em qualquer DataFrame para renderizar seu grafo de computação.
Exemplo: operações mescladas em um único estágio
Quando nenhum limite de cache separa as operações, o PyODPS as combina automaticamente:
>>> df = iris.groupby('name').agg(id=iris.sepalwidth.sum())
>>> df = df[df.name, df.id + 3]
>>> df.visualize()

O grafo mostra que o PyODPS mescla as operações de groupby e filtragem de colunas em um único estágio.
Exemplo: operações divididas em dois estágios
Inserir .cache() entre operações força um limite de estágio:
>>> df = iris.groupby('name').agg(id=iris.sepalwidth.sum()).cache()
>>> df2 = df[df.name, df.id + 3]
>>> df2.visualize()

O grafo agora exibe dois estágios porque a chamada .cache() cria um limite de execução explícito. A comparação desses dois grafos evidencia onde ocorrem as divisões de estágio e onde a mesclagem é possível.
Inspecionar o SQL compilado
Chame .compile() para ver o SQL que o PyODPS gera para o backend MaxCompute SQL. Utilize esse recurso para verificar se a consulta gerada corresponde à sua intenção antes de enviar um job.
>>> 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`
Executar localmente com pandas
Para iterações mais rápidas, baixe uma pequena amostra de dados do MaxCompute e execute-a no backend de computação pandas. Como o PyODPS usa o serviço MaxCompute Tunnel para baixar dados diretamente, isso ignora completamente o agendador do backend MaxCompute SQL e elimina a espera pelo agendamento de jobs.
As seguintes operações acionam um download via Tunnel em vez de um job MaxCompute SQL:
Tabela não particionada: selecione todas ou algumas linhas, filtre colunas ou conte linhas. A filtragem de colunas não calcula os valores das colunas.
>>> iris.count()
>>> iris['name', 'sepalwidth'][:10]
Tabela particionada: selecione linhas de todas ou das primeiras colunas de partição, filtre colunas ou conte linhas.
>>> 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)]
Alternar entre modo local e de produção
Use um sinalizador DEBUG para alternar entre a execução local com pandas e a execução completa no MaxCompute:
>>> DEBUG = True
>>> if DEBUG:
>>> df = iris[:100].to_pandas(wrap=True)
>>> else:
>>> df = iris
Defina DEBUG = True durante o desenvolvimento para baixar dados localmente. Defina DEBUG = False antes de executar em produção para realizar a computação completa no MaxCompute.
A execução local e a execução no MaxCompute não são equivalentes. Alguns programas aprovados na depuração local podem falhar no MaxCompute devido a restrições de sandbox. Sempre teste no ambiente de produção antes de confiar nos resultados locais.