Lorsque vous écrivez du code de manière interactive sur Jupyter et interrogez BigQuery, une faute de frappe entraîne des frais inopinément élevés. Par exemple, lorsque vous souhaitez obtenir des données pendant 3 jours, définissez la date à transmettre sur TABLE_DATE_RANGE
TABLE_DATE_RANGE (xxx_, TIMESTAMP ('2017-05-01'), TIMETAMP ('2017-05-03'))
TABLE_DATE_RANGE (xxx_, TIMESTAMP ('2016-05-01'), TIMETAMP ('2017-05-03'))
Et une faute de frappe analysera la table pendant 1 an et 3 jours. Je remarque cela lorsque j'examine la requête car j'étais méfiant car les résultats ne sont pas revenus facilement après avoir soumis le travail de requête.
Pour éviter cela sans compromettre l'attrait d'un environnement interactif où vous pouvez écrire et exécuter immédiatement, vous pouvez le vérifier au moment de l'exécution. Heureusement, il peut être spécifié comme option à partir de la v0.20 de Pandas.
Il est bon de préparer le wrapper suivant pour pd.read_gbq
afin de pouvoir spécifier la limite supérieure du coût par requête.
COST_LIMIT_PER_QUERY = 1 # USD
GBYTE = 1000000000
maximum_bytes_billed = int(COST_LIMIT_PER_QUERY * 200 * GBYTE)
def read_gbq(query):
return pd.read_gbq(
query, project_id=PROJECT_ID, verbose=False,
configuration={'query':{
'maximumBytesBilled': maximum_bytes_billed,
'maximumBillingTier': 1 #Je ne l'ai jamais vu devenir 2, donc il est fixé à 1.
}})
Si vous atteignez la limite supérieure de maximumBytesBilled
, le message d'erreur contiendra les valeurs nécessaires pour exécuter la requête.
Exemple
GenericGBQException: Reason: bytesBilledLimitExceeded, Message: Query exceeded limit for bytes billed: 2000000. 20971520 or higher required.