[PYTHON] Essayez la comparaison de vitesse de l'API BigQuery Storage

Lors d'opérations et d'analyses liées au ML, il arrive souvent que les données sur BigQuery soient directement téléchargées localement et traitées. Récemment, j'utilise souvent colaboratory pour l'analyse et la visualisation, donc je télécharge souvent des données avec des commandes magiques qui peuvent être utilisées rapidement, mais à mesure que les données cibles deviennent plus grandes, le temps requis pour le téléchargement devient considérablement plus long. Je vais.

Alors, Présentation des nouvelles fonctionnalités annoncées lors de Google Cloud Next '19! (Cloud Run, API BigQuery Storage, Cloud Data Fusion) À quelle vitesse la ** API BigQuery Storage ** est-elle introduite? Je vais essayer de voir si cela devient.

BigQuery Storage API Veuillez vous référer à l'article suivant pour plus de détails.

Installation

Pour tirer parti de l'API BigQuery Storage, installez la bibliothèque cliente BigQuery version 1.9.0 ou ultérieure et la bibliothèque cliente de l'API BigQuery Storage.

pip install --upgrade google-cloud-bigquery[bqstorage,pandas]

Comparaison de vitesse

La comparaison de vitesse compare ** jusqu'à ce que vous obteniez les données BQ de la requête et que vous les téléchargiez en tant que pandas.DataFrame.

Les tâches d'analyse des données utilisent souvent des requêtes pour récupérer les données des tables BQ et récupèrent rarement la table BQ elle-même. L'API BigQuery Storage vous permet d'appliquer des filtres de lignes simples, mais si vous souhaitez appliquer un filtrage complexe, vous devez les récupérer à l'aide d'une requête. Par conséquent, l'acquisition de données à l'aide directe de la bibliothèque cliente de l'API BigQuery Storage est exclue de la comparaison ici.

Les données à acquérir seront les données des données publiques de BigQuery aux données du journal de la page vue de Wikipédia à 0:00 le 1er janvier 2019.

bigquery-public-data.wikipedia.pageviews_2019

SELECT * FROM `bigquery-public-data.wikipedia.pageviews_2019` 
WHERE datehour = '2019-01-01'

Le nombre de colonnes est de 4, mais cela seul a 5 287 235 lignes, ce qui est des données assez robustes.

(Les données de l'ordre d'un million de lignes sont un volume qui se trouve dans Zara dans la tâche d'analyse, donc cela peut être une bonne cible de vérification)

Comparaison

L'environnement d'exécution est en collaboration.

Commande magique

L'acquisition à l'aide de la commande magique est la suivante.

%%bigquery --project <project_id> df_temp

SELECT * FROM `bigquery-public-data.wikipedia.pageviews_2019` 
where datehour = '2019-01-01'

En exécutant la commande ci-dessus dans la cellule de colaboratory, le résultat de l'acquisition sera obtenu sous la forme pandas.DataFrame dans df_temp.

Bibliothèque cliente BigQuery

En colaboratory, la bibliothèque cliente est déjà installée, vous pouvez donc l'importer telle quelle.

from google.cloud import bigquery

query = """
SELECT * FROM `bigquery-public-data.wikipedia.pageviews_2019` 
where datehour = '2019-01-01'
"""

client = bigquery.Client(project=<project_id>)
df_temp = client.query(query).to_dataframe()

BigQuery → (AVRO) → GCS C'est l'équivalent de la deuxième méthode décrite dans la présentation de l'API BigQuery Storage (https://cloud.google.com/bigquery/docs/reference/storage/#background).

La méthode consiste à enregistrer les résultats de la requête en tant que table temporaire à l'aide de la bibliothèque cliente BQ, à les exporter en tant que fichier AVRO vers GCS et à les charger en tant que pandas.DataFrame dans l'environnement d'exécution.

Dans l'expérience, nous avons développé une bibliothèque interne qui acquiert des données par cette méthode, nous allons donc l'utiliser.

Magic Command + API de stockage BigQuery

Pour utiliser l'API BigQuery Storage avec des commandes magiques, définissez la propriété context.use_bqstorage_api sur True comme suit:

import google.cloud.bigquery.magics
google.cloud.bigquery.magics.context.use_bqstorage_api = True

Après cela, utilisez la commande magique ci-dessus.

%%bigquery --project <project_id> df_temp

SELECT * FROM `bigquery-public-data.wikipedia.pageviews_2019` 
where datehour = '2019-01-01'

Bibliothèque cliente BigQuery + API de stockage BigQuery

Pour utiliser l'API BigQuery Storage dans la bibliothèque cliente, transmettez simplement l'objet client de l'API BigQuery Storage en tant qu'argument à la méthode to_dataframe (). (Cantan!)

from google.cloud import bigquery
from google.cloud import bigquery_storage_v1beta1

query = """
SELECT * FROM `bigquery-public-data.wikipedia.pageviews_2019` 
where datehour = '2019-01-01'
"""

bq_client = bigquery.Client(project=<project_id>)
bqstorage_client = bigquery_storage_v1beta1.BigQueryStorageClient()
df_temp = bq_client.query(query).to_dataframe(bqstorage_client)

Expérience

Comme indiqué ci-dessus, le temps ** entre la requête et pandas.DataFrame **. La mesure du temps est effectuée en attachant la commande magique «% time» à la ligne correspondante. Lors de l'utilisation de la bibliothèque cliente, cela ressemble à ce qui suit:

from google.cloud import bigquery

query = """
SELECT * FROM `bigquery-public-data.wikipedia.pageviews_2019` 
where datehour = '2019-01-01'
"""

client = bigquery.Client(project=<project_id>)
%time df_temp = client.query(query).to_dataframe() # <--Mesurer ici

Dans [Magic Command](#Magic Command) et [Magic Command + BigQuery Storage API](#Magic Command --bigquery-storage-api), ajoutez «%% time» à la première ligne de la cellule pour ajouter «%% time» à la cellule entière. Mesurez le temps.

%%time
%%bigquery --project <project_id> df_temp

SELECT * FROM `bigquery-public-data.wikipedia.pageviews_2019` 
where datehour = '2019-01-01'

Les deux sont des mesures uniques, alors sachez qu'il existe des variations.

Résultat de la mesure

Méthode CPU time Wall time
Commande magique 2min 9s 4min 48s
Commande magique+ BigQuery Storage API 19.6 s 21.2 s
Bibliothèque cliente BQ 2min 9s 5min 1s
BQ -> (AVRO) -> GCS 57.1 s 1min 42s
Bibliothèque cliente BQ+ BigQuery Storage API 19.7 s 36.8 s

D'après le résultat, la méthode utilisant l'API BigQuery Storage est ** extrêmement rapide **. .. .. Un ordre de grandeur plus rapide. ..

([BQ-> (AVRO) -> GCS](# bigquery - avro - gcs) a créé une bibliothèque.)

en conclusion

La conclusion est que l'API BigQuery Storage est le choix pour les méthodes rapides de récupération des données de table BQ à partir de requêtes en tant que pandas.DataFrame.

Une dernière note.

Au 17 décembre 2019, il était toujours en version bêta, il semble donc qu'il ne puisse être utilisé que dans les multi-régions des États-Unis et de l'UE. vue d'ensemble a la multi-région US / EU + quelques emplacements (ʻasia-east1, , Asia-Nordest1, ʻasia-sud1, ʻasia-sud-est1, ʻeurope-west2, northamerica-nordest1`) est incluse, mais [Price Page](https://cloud.google.com / bigquery / pricing # storage-api) indique Indisponible sauf pour les multi-régions US / EU. (En fait, peut-il être utilisé simplement parce que le document ne rattrape pas son retard?)

Veuillez faire attention à l'emplacement de l'ensemble de données lors de son utilisation. ..

À propos, les frais sont facturés en fonction du nombre d'octets lus à partir du stockage BigQuery en appelant ReadRows, et ils sont essentiellement facturés en fonction de la quantité de données lues par ReadRows de l'API BigQuery Storage. Cela semble être un mécanisme (je suis désolé si la reconnaissance est erronée).

(@ na0 Merci m (_ _) m)

Recommended Posts

Essayez la comparaison de vitesse de l'API BigQuery Storage
Comparaison de la vitesse de la perspective XML Python
Comparaison de vitesse de murmurhash3, md5 et sha1
J'ai essayé d'utiliser l'API BigQuery Storage
[Python3] Comparaison de vitesse, etc. sur la privation de numpy.ndarray
Essayez de détecter un objet avec RaspberryPi ~ Partie 1: Comparaison de la vitesse de détection ~
Essayez d'utiliser l'API kabu station de au Kabucom Securities
Comparaison de vitesse de chaque langue par la méthode de Monte Carlo
Comparaison des implémentations LDA
Comparaison des classificateurs en ligne
Comparaison des programmes d'adaptation
Essayez l'API C ++ de NNabla