Optimiser les performances de BigQuery DataFrames
BigQuery DataFrames vous aide à analyser et à transformer des données dans BigQuery à l'aide d'une API compatible avec pandas. Pour accélérer le traitement de vos données et le rendre plus économique, vous pouvez utiliser plusieurs techniques afin d'améliorer les performances.
Ce document décrit les différentes façons d'optimiser les performances :
- Utilisez le mode de tri partiel.
- Mettez en cache les résultats après des opérations coûteuses.
- Prévisualisez les données à l'aide de la méthode
peek()
. - Différer la récupération des données
repr()
.
Utiliser le mode de tri partiel
BigQuery DataFrames dispose d'une fonctionnalité de mode de tri qui applique un ordre de ligne spécifique pour les opérations telles que les fonctions de fenêtre et les jointures. Vous pouvez spécifier le mode de tri en définissant la propriété ordering_mode
sur strict
(appelé mode de tri strict, qui est la valeur par défaut) ou partial
(appelé mode de tri partiel). L'utilisation du paramètre partial
peut rendre vos requêtes plus efficaces.
Le mode de tri partiel est différent du mode de tri strict. Le mode d'ordre strict organise toutes les lignes dans un ordre spécifique. Ce tri total permet à BigQuery DataFrames de mieux fonctionner avec pandas, ce qui vous permet d'accéder aux lignes par ordre à l'aide de la propriété DataFrame.iloc
. Toutefois, le tri total et son index séquentiel par défaut empêchent les filtres sur les colonnes ou les lignes de réduire la quantité de données analysées. Cette prévention se produit, sauf si vous appliquez ces filtres en tant que paramètres aux fonctions read_gbq
et read_gbq_table
. Pour trier toutes les lignes du DataFrame, BigQuery DataFrames crée un hachage de toutes les lignes. Cette opération peut entraîner une analyse complète des données qui ignore les filtres de lignes et de colonnes.
Le mode de tri partiel empêche BigQuery DataFrames de créer un tri total pour toutes les lignes et désactive les fonctionnalités qui nécessitent un tri total, comme la propriété DataFrame.iloc
. Le mode de tri partiel définit également la classe DefaultIndexKind
sur un index nul, au lieu d'un index séquentiel.
Lorsque vous filtrez un objet DataFrame
à l'aide du mode de tri partiel, BigQuery DataFrames ne calcule pas les lignes manquantes dans l'index séquentiel. Le mode de tri partiel ne combine pas non plus automatiquement les données en fonction de l'index. Ces approches peuvent améliorer l'efficacité de vos requêtes.
Toutefois, que vous utilisiez le mode de tri strict par défaut ou le mode de tri partiel, l'API BigQuery DataFrames fonctionne comme l'API pandas que vous connaissez.
Dans les modes de tri partiel et strict, vous payez les ressources BigQuery que vous utilisez. Toutefois, l'utilisation du mode de tri partiel peut réduire les coûts lorsque vous utilisez des tables volumineuses regroupées et partitionnées. Cette réduction des coûts est due au fait que les filtres de ligne sur les colonnes de cluster et de partition réduisent la quantité de données traitées.
Activer le mode de tri partiel
Pour utiliser le tri partiel, définissez la propriété ordering_mode
sur partial
avant d'effectuer toute autre opération avec BigQuery DataFrames, comme illustré dans l'exemple de code suivant :
Le mode de tri partiel empêche les jointures implicites d'objets BigQuery DataFrames non associés, car il ne comporte pas d'index séquentiel.
Vous devez plutôt appeler explicitement la méthode DataFrame.merge
pour joindre deux objets BigQuery DataFrames qui proviennent de différentes expressions de table.
Les fonctionnalités Series.unique()
et Series.drop_duplicates()
ne fonctionnent pas avec le mode de tri partiel. Utilisez plutôt la méthode groupby
pour rechercher des valeurs uniques, comme indiqué dans l'exemple suivant :
Avec le mode de tri partiel, le résultat des fonctions DataFrame.head(n)
et Series.head(n)
peut ne pas être le même à chaque fois que vous les exécutez. Pour télécharger un petit échantillon aléatoire des données, utilisez les méthodes DataFrame.peek()
ou Series.peek()
.
Pour un tutoriel détaillé dans lequel vous utilisez la propriété ordering_mode = "partial"
, consultez Analyser les téléchargements de packages depuis PyPI avec BigQuery DataFrames.
Dépannage
Étant donné que BigQuery DataFrames en mode de tri partiel manque parfois d'un ordre ou d'un index, vous pouvez rencontrer les problèmes suivants lorsque vous utilisez certaines méthodes compatibles avec pandas.
Erreur : tri requis
Certaines fonctionnalités, comme les fonctions DataFrame.head()
et DataFrame.iloc
, nécessitent un tri. Pour obtenir la liste des fonctionnalités qui nécessitent d'être triées, consultez la colonne Tri nécessaire dans la section API pandas compatibles.
Lorsqu'un objet n'est pas trié, l'opération échoue et un message OrderRequiredError
semblable au suivant s'affiche : OrderRequiredError: Op iloc
requires an ordering. Use .sort_values or .sort_index to provide an ordering.
Comme l'indique le message d'erreur, vous pouvez effectuer un tri à l'aide de la méthode DataFrame.sort_values()
pour trier par une ou plusieurs colonnes. D'autres méthodes, telles que DataFrame.groupby()
, fournissent implicitement un tri total basé sur les clés de regroupement.
Si le tri n'est pas un tri total entièrement stable pour toutes les lignes, les opérations ultérieures peuvent afficher un message AmbiguousWindowWarning
semblable à celui-ci : AmbiguousWindowWarning: Window ordering may be ambiguous, this can
cause unstable results.
Si votre charge de travail peut accepter des résultats qui ne sont pas toujours les mêmes, ou si vous pouvez vérifier manuellement que votre tri est un tri total, vous pouvez filtrer le message AmbiguousWindowWarning
de la manière suivante :
Erreur d'index nul
Certaines fonctionnalités, comme les propriétés DataFrame.unstack()
et Series.interpolate()
, nécessitent un index. Pour obtenir la liste des fonctionnalités qui nécessitent un index, consultez la colonne Nécessite un index dans la section API pandas compatibles.
Lorsque vous utilisez une opération qui nécessite un index avec le mode de tri partiel, l'opération génère un message NullIndexError
semblable à celui-ci :
NullIndexError: DataFrame cannot perform interpolate as it has no index.
Set an index using set_index.
Comme l'indique le message d'erreur, vous pouvez fournir un index à l'aide de la méthode DataFrame.set_index()
pour trier par une ou plusieurs colonnes. D'autres méthodes, telles que DataFrame.groupby()
, fournissent implicitement un index basé sur les clés de regroupement, sauf si le paramètre as_index=False
est défini.
Mettre en cache les résultats après des opérations coûteuses
BigQuery DataFrames stocke les opérations localement et diffère l'exécution des requêtes jusqu'à ce que certaines conditions soient remplies. Cela peut entraîner l'exécution des mêmes opérations plusieurs fois dans différentes requêtes.
Pour éviter de répéter des opérations coûteuses, enregistrez les résultats intermédiaires avec la méthode cache()
, comme indiqué dans l'exemple suivant :
Cette méthode crée une table BigQuery temporaire pour stocker vos résultats. Le stockage de cette table temporaire dans BigQuery vous est facturé.
Prévisualiser vos données avec la méthode peek()
BigQuery DataFrames propose deux méthodes d'API pour prévisualiser les données :
peek(n)
renvoien
lignes de données, oùn
correspond au nombre de lignes.head(n)
renvoie lesn
premières lignes de données, selon le contexte, oùn
correspond au nombre de lignes.
N'utilisez la méthode head()
que lorsque l'ordre des données est important, par exemple lorsque vous souhaitez obtenir les cinq plus grandes valeurs d'une colonne. Dans d'autres cas, utilisez la méthode peek()
pour récupérer les données plus efficacement, comme indiqué dans l'exemple de code suivant :
Vous pouvez également utiliser la méthode peek()
pour télécharger un petit échantillon aléatoire de données en utilisant le mode de tri partiel.
Différer la récupération des données repr()
Vous pouvez appeler la méthode repr()
dans BigQuery DataFrames avec des notebooks ou le débogueur de votre IDE. Cet appel déclenche l'appel head()
qui récupère les données réelles. Cette récupération peut ralentir votre processus itératif de codage et de débogage, et entraîner des coûts.
Pour empêcher la méthode repr()
de récupérer des données, définissez l'attribut repr_mode
sur "deferred"
, comme indiqué dans l'exemple suivant :
En mode différé, vous ne pouvez prévisualiser vos données qu'avec des appels peek()
et head()
explicites.
Étapes suivantes
- Découvrez comment utiliser BigQuery DataFrames.
- Découvrez comment visualiser les DataFrames BigQuery.
- Explorez la documentation de référence de l'API BigQuery DataFrames.
- Consultez le code source, les notebooks exemples et les exemples BigQuery DataFrames sur GitHub.