Otimizar a performance do BigQuery DataFrames
O BigQuery DataFrames ajuda a analisar e transformar dados no BigQuery usando uma API compatível com o pandas. Para tornar o processamento de dados mais rápido e econômico, você pode usar várias técnicas para melhorar a performance.
Este documento descreve as seguintes maneiras de otimizar a performance:
- Usar o modo de ordenação parcial.
- Armazenar em cache os resultados após operações caras.
- Visualizar dados usando o método
peek(). - Adiar a recuperação de dados
repr().
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 junções. É possível
especificar o modo de ordenação definindo a propriedade ordering_mode como
strict (conhecido como modo de ordenação estrita, 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 o BigQuery DataFrames funcione melhor com o pandas, permitindo que você acesse linhas por ordem 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 completa de dados que ignora filtros de linha e coluna.
O modo de ordenação parcial impede que o BigQuery DataFrames crie 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
DefaultIndexKind classe
como um índice nulo, em vez de um índice sequencial.
Ao filtrar 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 consultas.
No entanto, seja usando o modo de ordenação estrita padrão ou o modo de ordenação parcial, a API BigQuery DataFrames funciona como a API pandas familiar.
Com os modos de ordenação parcial e estrita, você paga pelos recursos do BigQuery que usa. 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 custos ocorre porque os filtros de linha em colunas de cluster e partição reduzem a quantidade de dados processados.
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 o BigQuery DataFrames, conforme mostrado no exemplo de código a seguir:
O modo de ordenação parcial impede junções implícitas de objetos não relacionados do BigQuery DataFrames porque não tem um índice sequencial.
Em vez disso, é necessário chamar explicitamente o método DataFrame.merge para unir 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
DataFrame.peek() ou Series.peek() métodos.
Para um tutorial detalhado em que você usa a ordering_mode = "partial"
propriedade, consulte
Como analisar downloads de pacotes do PyPI com o BigQuery DataFrames.
Solução de problemas
Como o BigQuery DataFrames no modo de ordenação parcial às vezes não tem uma ordenação ou índice, você pode encontrar os seguintes problemas ao usar alguns métodos compatíveis com o pandas.
Erro de ordem necessária
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 Requer
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 afirma, é possível fornecer uma ordenação usando o
DataFrame.sort_values() método
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, a execução do mesmo código poderá produzir resultados diferentes a cada vez. 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,
a operação 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 afirma, é possível fornecer um índice usando o
DataFrame.set_index() método
para classificar por uma ou mais colunas. Outros métodos, como
DataFrame.groupby(),
fornecem implicitamente um índice com base nas chaves de agrupar por, a menos que o
as_index=False parâmetro esteja definido.
Armazenar em cache os resultados 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 a repetição de 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. Você recebe cobranças pelo armazenamento dessa tabela temporária no BigQuery.
Visualizar 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 fazer o download de uma amostra pequena e aleatória de dados
ao usar o modo de ordenação parcial.
Adiar a recuperação de dados repr()
É possível chamar o método repr() no BigQuery DataFrames com
notebooks ou no depurador do ambiente de desenvolvimento integrado. Essa chamada aciona a chamada head() que recupera os dados reais. Essa recuperação pode desacelerar o processo iterativo de codificação e depuração e também 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
peek() e head().
A seguir
- Saiba mais sobre BigQuery DataFrames.
- Saiba como visualizar o BigQuery DataFrames.
- Confira a referência da API BigQuery DataFrames.
- Confira o código-fonte do BigQuery DataFrames , os notebooks de exemplo e os exemplos no GitHub.