Ottimizza le prestazioni di BigQuery DataFrames
Puoi ottimizzare i flussi di lavoro di BigQuery DataFrames per analizzare e trasformare i dati utilizzando un'API compatibile con pandas, mantenendo al contempo bassi i tempi e i costi di esecuzione. L'applicazione di tecniche di ottimizzazione specifiche, come la modalità di ordinamento parziale e la memorizzazione nella cache dei risultati, consente di elaborare i dati in modo più rapido ed economico.
Utilizza la modalità di ordinamento parziale
BigQuery DataFrames dispone di una funzionalità di modalità di ordinamento che applica un ordine di riga specifico per operazioni come le funzioni finestra e i join. Puoi specificare la modalità di ordinamento impostando la proprietà ordering_mode su strict (nota come modalità di ordinamento rigoroso, che è l'impostazione predefinita) o su partial (nota come modalità di ordinamento parziale). L'utilizzo dell'impostazione partial può rendere le query più efficienti.
La modalità di ordinamento parziale è diversa dalla modalità di ordinamento rigoroso. La modalità di ordinamento rigoroso dispone tutte le righe in un ordine specifico. Questo ordinamento totale consente a BigQuery DataFrames di funzionare meglio con pandas, permettendoti di accedere alle righe in base al loro ordine utilizzando la proprietà DataFrame.iloc. Tuttavia, l'ordinamento totale e l'indice sequenziale predefinito impediscono ai filtri su colonne o righe di ridurre la quantità di dati scansionati. Questa prevenzione si verifica a meno che non applichi questi filtri come parametri alle funzioni read_gbq e read_gbq_table. Per ordinare tutte le righe nel DataFrame, BigQuery DataFrames crea un hash di tutte le righe. Questa operazione può causare una scansione completa dei dati che ignora i filtri di riga e colonna.
La modalità di ordinamento parziale impedisce a BigQuery DataFrames di creare un ordine totale per tutte le righe e disattiva le funzionalità che richiedono un ordine totale, come la proprietà DataFrame.iloc. La modalità di ordinamento parziale imposta anche la classe DefaultIndexKind su un indice null, anziché su un indice sequenziale.
Quando filtri un oggetto DataFrame utilizzando la modalità di ordinamento parziale, BigQuery DataFrames non calcola quali righe mancano nell'indice sequenziale. Inoltre, la modalità di ordinamento parziale non combina automaticamente i dati in base all'indice. Questi approcci possono aumentare l'efficienza delle query.
Tuttavia, indipendentemente dal fatto che utilizzi la modalità di ordinamento rigoroso predefinita o la modalità di ordinamento parziale, l'API BigQuery DataFrames funziona come la familiare API pandas.
Con entrambe le modalità di ordinamento parziale e rigoroso, paghi per le risorse BigQuery che utilizzi. Tuttavia, l'utilizzo della modalità di ordinamento parziale può ridurre i costi quando si lavora con tabelle raggruppate e partizionate di grandi dimensioni. Questa riduzione dei costi si verifica perché i filtri di riga sulle colonne di cluster e partizione riducono la quantità di trattamento dati.
Attiva la modalità di ordinamento parziale
Per utilizzare l'ordinamento parziale, imposta la proprietà ordering_mode su partial prima di eseguire qualsiasi altra operazione con BigQuery DataFrames, come mostrato nell'esempio di codice seguente:
La modalità di ordinamento parziale impedisce i join impliciti di oggetti BigQuery DataFrames non correlati perché non dispone di un indice sequenziale.
Devi invece chiamare esplicitamente il metodo DataFrame.merge per unire due oggetti BigQuery DataFrames che derivano da espressioni di tabella diverse.
Le funzionalità Series.unique() e Series.drop_duplicates() non funzionano con la modalità di ordinamento parziale. Utilizza invece il metodo groupby per trovare valori univoci, come mostrato nell'esempio seguente:
Con la modalità di ordinamento parziale, l'output delle funzioni DataFrame.head(n) e Series.head(n) potrebbe non essere lo stesso ogni volta che le esegui. Per scaricare un piccolo campione casuale dei dati, utilizza i metodi DataFrame.peek() o Series.peek().
Per un tutorial dettagliato in cui utilizzi la proprietà ordering_mode = "partial", consulta Analisi dei download di pacchetti da PyPI con BigQuery DataFrames.
Risoluzione dei problemi
Poiché BigQuery DataFrames in modalità di ordinamento parziale a volte non dispone di un ordinamento o di un indice, potresti riscontrare i seguenti problemi quando utilizzi alcuni metodi compatibili con pandas.
Errore di ordine obbligatorio
Alcune funzionalità, come le funzioni DataFrame.head() e DataFrame.iloc, richiedono un ordinamento. Per un elenco delle funzionalità che richiedono l'ordinamento, consulta la colonna Richiede l'ordinamento in API pandas supportate.
Quando un oggetto non ha un ordinamento, l'operazione non riesce e viene visualizzato un messaggio OrderRequiredError come il seguente: OrderRequiredError: Op iloc
requires an ordering. Use .sort_values or .sort_index to provide an ordering.
Come indicato nel messaggio di errore, puoi fornire un ordinamento utilizzando il metodo DataFrame.sort_values() per ordinare in base a una o più colonne. Altri metodi, come
DataFrame.groupby(),
forniscono implicitamente un ordinamento totale basato sulle chiavi di raggruppamento.
A differenza di pandas, se sei in modalità di ordinamento parziale, l'esecuzione dello stesso codice potrebbe produrre risultati diversi ogni volta che lo esegui. Per garantire risultati coerenti, utilizza un ordinamento totale stabile per tutte le righe.
Errore di indice null
Alcune funzionalità, come le proprietà DataFrame.unstack() e Series.interpolate(), richiedono un indice. Per un elenco delle funzionalità che richiedono un indice, consulta la colonna Richiede indice in API pandas supportate.
Quando utilizzi un'operazione che richiede un indice con modalità di ordinamento parziale, l'operazione genera un messaggio NullIndexError come il seguente:
NullIndexError: DataFrame cannot perform interpolate as it has no index.
Set an index using set_index.
Come indicato nel messaggio di errore, puoi fornire un indice utilizzando il metodo DataFrame.set_index() per ordinare in base a una o più colonne. Altri metodi, come
DataFrame.groupby(),
forniscono implicitamente un indice basato sulle chiavi di raggruppamento, a meno che non sia impostato il parametro
as_index=False.
Memorizza nella cache i risultati dopo operazioni costose
BigQuery DataFrames archivia le operazioni localmente e rimanda l'esecuzione delle query finché non vengono soddisfatte determinate condizioni. Ciò può comportare l'esecuzione delle stesse operazioni più volte in query diverse.
Per evitare di ripetere operazioni costose, salva i risultati intermedi con il metodo cache(), come mostrato nell'esempio seguente:
Questo metodo crea una tabella BigQuery temporanea per archiviare i risultati. Ti viene addebitato il costo dell'archiviazione di questa tabella temporanea in BigQuery.
Visualizza l'anteprima dei dati con il metodo peek()
BigQuery DataFrames offre due metodi API per visualizzare l'anteprima dei dati:
peek(n)restituiscenrighe di dati, dovenè il numero di righe.head(n)restituisce le primenrighe di dati, a seconda del contesto, dovenè il numero di righe.
Utilizza il metodo head() solo quando l'ordine dei dati è importante, ad esempio quando vuoi i cinque valori più grandi in una colonna. In altri casi, utilizza il metodo peek() per un recupero dei dati più efficiente, come mostrato nel seguente esempio di codice:
Puoi anche utilizzare il metodo peek() per scaricare un piccolo campione casuale di dati
mentre utilizzi la modalità di ordinamento parziale.
Rimanda il recupero dei dati repr()
Puoi chiamare il metodo repr() in BigQuery DataFrames con i notebook o il debugger dell'IDE. Questa chiamata attiva la chiamata head() che recupera i dati effettivi. Questo recupero può rallentare il processo di programmazione e debug iterativo e comportare costi.
Per impedire al metodo repr() di recuperare i dati, imposta l'attributo repr_mode su "deferred", come mostrato nell'esempio seguente:
In modalità differita, puoi visualizzare l'anteprima dei dati solo con chiamate peek() e head() esplicite.
Passaggi successivi
- Scopri di più su BigQuery DataFrames.
- Scopri come visualizzare i BigQuery DataFrame.
- Esplora il riferimento API BigQuery DataFrames.
- Visualizza il codice sorgente, i notebook di esempio e gli esempi di BigQuery DataFrames su GitHub.