Otimizar o desempenho dos BigQuery DataFrames
É possível otimizar seus fluxos de trabalho do BigQuery DataFrames para analisar e transformar dados usando uma API compatível com pandas, mantendo os tempos de execução e os custos baixos. A aplicação de técnicas de otimização específicas, como o modo de ordenação parcial e o armazenamento em cache de resultados, permite processar dados de forma mais rápida e econômica.
Usar o modo de ordenação parcial
O BigQuery DataFrames tem um recurso de modo de ordenação, que impõe uma
ordem de linha específica para operações como funções de janela e mesclagens. É possível
especificar o modo de ordenação definindo a propriedade ordering_mode como
strict (conhecido como modo de ordenação estrito, que é o padrão) ou
partial (conhecido como modo de ordenação parcial). O uso da configuração partial pode tornar suas consultas mais eficientes.
O modo de ordenação parcial é diferente do modo de ordenação estrita. O modo de ordenação estrita organiza todas as linhas em uma ordem específica. Essa ordenação total faz com que os BigQuery DataFrames funcionem melhor com o pandas, permitindo que você acesse as linhas pela ordem delas usando a propriedade DataFrame.iloc. No entanto, a ordenação total e o índice sequencial padrão impedem que os filtros em colunas ou linhas reduzam a quantidade de dados verificados. Essa prevenção ocorre, a menos que você aplique esses filtros como parâmetros às funções read_gbq e read_gbq_table. Para ordenar
todas as linhas no DataFrame, o BigQuery DataFrames cria um hash de todas
as linhas. Essa operação pode causar uma verificação de dados completa que ignora os filtros de linha e coluna.
O modo de ordenação parcial impede que os BigQuery DataFrames criem uma ordem total para todas as linhas e desativa recursos que precisam de uma ordem total, como a propriedade DataFrame.iloc. O modo de ordenação parcial também define a
classe DefaultIndexKind
como um índice nulo, em vez de um índice sequencial.
Quando você filtra um objeto DataFrame usando o modo de ordenação parcial,
o BigQuery DataFrames não calcula quais linhas estão ausentes no
índice sequencial. O modo de ordenação parcial também não combina dados automaticamente
com base no índice. Essas abordagens podem aumentar a eficiência das suas consultas.
No entanto, se você usar o modo de ordenação estrita padrão ou o modo de ordenação parcial, a API BigQuery DataFrames vai funcionar como a API pandas.
Nos modos de ordenação parcial e estrita, você paga pelos recursos do BigQuery que usar. No entanto, o uso do modo de ordenação parcial pode reduzir os custos ao trabalhar com tabelas grandes em cluster e particionadas. Essa redução de custo ocorre porque os filtros de linha em colunas de cluster e partição reduzem a quantidade de tratamento de dados.
Ativar o modo de ordenação parcial
Para usar a ordenação parcial, defina a propriedade ordering_mode como partial antes de realizar qualquer outra operação com os BigQuery DataFrames, conforme mostrado no exemplo de código a seguir:
O modo de ordenação parcial impede mesclagens implícitas de objetos não relacionados do BigQuery DataFrames porque não tem um índice sequencial.
Em vez disso, é preciso chamar explicitamente o método DataFrame.merge para mesclar dois objetos do BigQuery DataFrames que derivam de expressões de tabela diferentes.
Os recursos Series.unique() e Series.drop_duplicates() não funcionam com o
modo de ordenação parcial. Em vez disso, use o método groupby para encontrar valores exclusivos, conforme mostrado no exemplo a seguir:
Com o modo de ordenação parcial, a saída das funções DataFrame.head(n) e
Series.head(n) pode não ser a mesma sempre que você as executa. Para
fazer o download de uma amostra pequena e aleatória dos dados, use os
métodos DataFrame.peek() ou Series.peek().
Para um tutorial detalhado em que você usa a propriedade ordering_mode = "partial", consulte Como analisar downloads de pacotes do PyPI com o BigQuery DataFrames.
Solução de problemas
Como os BigQuery DataFrames no modo de ordenação parcial às vezes não têm uma ordenação ou um índice, talvez você encontre os seguintes problemas ao usar alguns métodos compatíveis com pandas.
Erro de pedido obrigatório
Alguns recursos, como as funções DataFrame.head() e DataFrame.iloc, precisam
de uma ordenação. Para uma lista de recursos que exigem ordenação, consulte a coluna Exige ordenação em APIs pandas compatíveis.
Quando um objeto não tem ordenação, a operação falha com uma
mensagem OrderRequiredError como esta: OrderRequiredError: Op iloc
requires an ordering. Use .sort_values or .sort_index to provide an ordering.
Como a mensagem de erro indica, é possível fornecer uma ordenação usando o
método DataFrame.sort_values()
para classificar por uma ou mais colunas. Outros métodos, como
DataFrame.groupby(),
fornecem implicitamente uma ordenação total com base nas chaves de agrupar por.
Ao contrário do pandas, se você estiver no modo de ordenação parcial, executar o mesmo código pode produzir resultados diferentes a cada execução. Para garantir resultados consistentes, use uma ordenação total estável para todas as linhas.
Erro de índice nulo
Alguns recursos, como as propriedades DataFrame.unstack() e Series.interpolate(), precisam de um índice. Para uma lista de recursos que exigem um índice, consulte
a coluna Requer índice em
APIs pandas compatíveis.
Quando você usa uma operação que exige um índice com o modo de ordenação parcial,
ela gera uma mensagem NullIndexError como esta:
NullIndexError: DataFrame cannot perform interpolate as it has no index.
Set an index using set_index.
Como a mensagem de erro indica, é possível fornecer um índice usando o
método DataFrame.set_index()
para classificar por uma ou mais colunas. Outros métodos, como
DataFrame.groupby(),
fornecem implicitamente um índice com base nas chaves de agrupamento, a menos que o
parâmetro as_index=False esteja definido.
Armazenar resultados em cache após operações caras
O BigQuery DataFrames armazena operações localmente e adia a execução de consultas até que determinadas condições sejam atendidas. Isso pode fazer com que as mesmas operações sejam executadas várias vezes em consultas diferentes.
Para evitar repetir operações caras, salve os resultados intermediários com o método cache(), conforme mostrado no exemplo a seguir:
Esse método cria uma tabela temporária do BigQuery para armazenar os resultados. O armazenamento dessa tabela temporária no BigQuery é cobrado.
Visualizar os dados com o método peek()
O BigQuery DataFrames oferece dois métodos de API para visualizar dados:
peek(n)retornanlinhas de dados, em quené o número de linhas.head(n)retorna as primeirasnlinhas de dados, dependendo do contexto, em quené o número de linhas.
Use o método head() somente quando a ordem dos dados for importante, por exemplo,
quando você quiser os cinco maiores valores em uma coluna. Em outros casos, use o método peek() para uma recuperação de dados mais eficiente, conforme mostrado no exemplo de código a seguir:
Também é possível usar o método peek() para baixar uma amostra pequena e aleatória de dados
ao usar o modo de ordenação parcial.
Adiar a recuperação de dados do repr()
É possível chamar o método repr() em BigQuery DataFrames com
Notebooks ou o depurador do IDE. Essa chamada aciona a chamada head() que recupera os dados reais. Essa recuperação
pode desacelerar o processo iterativo de programação e depuração, além de gerar custos.
Para impedir que o método repr() recupere dados, defina o atributo repr_mode
como "deferred", conforme mostrado no exemplo a seguir:
No modo adiado, só é possível visualizar os dados com chamadas explícitas de peek() e head().
A seguir
- Saiba mais sobre os DataFrames do BigQuery.
- Saiba como visualizar os DataFrames do BigQuery.
- Confira a referência da API BigQuery DataFrames.
- Confira o código-fonte, os notebooks de amostra e as amostras do BigQuery DataFrames no GitHub.