Télécharger des données BigQuery sur pandas à l'aide de l'API BigQuery Storage

L'API BigQuery Storage offre un accès rapide aux données stockées dans BigQuery. Elle vous permet de télécharger les données stockées dans BigQuery afin de les utiliser dans des outils d'analyse tels que la bibliothèque pandas pour Python.

Objectifs

  • télécharger les résultats de la requête sur un objet DataFrame pandas à l'aide de l'API BigQuery Storage à partir des commandes magiques IPython pour BigQuery dans un notebook Jupyter ;
  • télécharger les résultats de la requête sur un objet DataFrame pandas à l'aide de la bibliothèque cliente BigQuery pour Python ;
  • télécharger les données d'une table BigQuery sur un objet DataFrame pandas à l'aide de la bibliothèque cliente BigQuery pour Python ;
  • télécharger les données de la table BigQuery sur un objet DataFrame pandas à l'aide de la bibliothèque cliente de l'API BigQuery Storage pour Python.

Coûts

BigQuery est un produit payant. Des coûts d'utilisation vous seront donc facturés pour les requêtes que vous exécutez. Le premier To de données de requêtes traitées chaque mois est gratuit. Pour en savoir plus, consultez la page des tarifs de BigQuery.

L'API BigQuery Storage est un produit payant, dont les coûts d'utilisation vous sont facturés pour les données de table que vous analysez lors du téléchargement d'un DataFrame. Pour en savoir plus, consultez la page des tarifs de BigQuery.

Avant de commencer

Avant de commencer ce tutoriel, utilisez Google Cloud Console pour créer ou sélectionner un projet, puis pour activer la facturation.

  1. Connectez-vous à votre compte Google Cloud. Si vous débutez sur Google Cloud, créez un compte pour évaluer les performances de nos produits en conditions réelles. Les nouveaux clients bénéficient également de 300 $ de crédits gratuits pour exécuter, tester et déployer des charges de travail.
  2. Dans Google Cloud Console, sur la page de sélection du projet, sélectionnez ou créez un projet Google Cloud.

    Accéder au sélecteur de projet

  3. Assurez-vous que la facturation est activée pour votre projet Cloud. Découvrez comment vérifier si la facturation est activée sur un projet.

  4. Dans Google Cloud Console, sur la page de sélection du projet, sélectionnez ou créez un projet Google Cloud.

    Accéder au sélecteur de projet

  5. Assurez-vous que la facturation est activée pour votre projet Cloud. Découvrez comment vérifier si la facturation est activée sur un projet.

  6. BigQuery est automatiquement activé dans les nouveaux projets. Pour activer BigQuery dans un projet préexistant,

    Activer les API BigQuery, BigQuery Storage API.

    Activer les API

  7. Configurez un environnement de développement Python.
    Configurer Python
  8. Configurez l'authentification pour votre environnement de développement.
    Configurer l'authentification

Vous devez également vous être familiarisé avec les commandes magiques IPython pour BigQuery, la bibliothèque cliente BigQuery et l'utilisation de la bibliothèque cliente avec pandas pour pouvoir suivre ce tutoriel.

Installer les bibliothèques clientes

Installez la bibliothèque cliente BigQuery Python version 1.9.0 ou ultérieure et la bibliothèque cliente Python de l'API BigQuery Storage.

PIP

Installez les packages google-cloud-bigquery et google-cloud-bigquery-storage.

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

Conda

Installez les packages Conda de BigQuery et de l'API BigQuery Storage à partir du canal conda-forge exécuté par la communauté.

conda install -c conda-forge google-cloud-bigquery \
  google-cloud-bigquery-storage \
  pandas \
  pyarrow

Télécharger les résultats de requêtes à l'aide des commandes magiques IPython pour BigQuery

Démarrez le serveur de notebooks Jupyter et créez un notebook Jupyter. Chargez les commandes magiques IPython pour BigQuery à l'aide de la commande magique %load_ext.

%load_ext google.cloud.bigquery

Depuis la version 1.26.0 du package Python google-cloud-bigquery, l'API BigQuery Storage est utilisée par défaut pour télécharger les résultats des commandes magiques %%bigquery.

%%bigquery tax_forms
SELECT * FROM `bigquery-public-data.irs_990.irs_990_2012`

Utiliser les bibliothèques clientes Python

Télécharger les résultats de requêtes à l'aide de la bibliothèque cliente BigQuery

Exécutez une requête à l'aide de la méthode query. Appelez la méthode to_dataframe pour attendre la fin de la requête et téléchargez les résultats à l'aide de l'API BigQuery Storage.

from google.cloud import bigquery

bqclient = bigquery.Client()

# Download query results.
query_string = """
SELECT
CONCAT(
    'https://stackoverflow.com/questions/',
    CAST(id as STRING)) as url,
view_count
FROM `bigquery-public-data.stackoverflow.posts_questions`
WHERE tags like '%google-bigquery%'
ORDER BY view_count DESC
"""

dataframe = (
    bqclient.query(query_string)
    .result()
    .to_dataframe(
        # Optionally, explicitly request to use the BigQuery Storage API. As of
        # google-cloud-bigquery version 1.26.0 and above, the BigQuery Storage
        # API is used by default.
        create_bqstorage_client=True,
    )
)
print(dataframe.head())

Télécharger des données de table à l'aide de la bibliothèque cliente BigQuery

Téléchargez toutes les lignes d'une table à l'aide de la méthode list_rows, qui renvoie un objet RowIterator. Téléchargez des lignes à l'aide de l'API BigQuery Storage en appelant la méthode to_dataframe avec l'argument bqstorage_client.

from google.cloud import bigquery

bqclient = bigquery.Client()

# Download a table.
table = bigquery.TableReference.from_string(
    "bigquery-public-data.utility_us.country_code_iso"
)
rows = bqclient.list_rows(
    table,
    selected_fields=[
        bigquery.SchemaField("country_name", "STRING"),
        bigquery.SchemaField("fips_code", "STRING"),
    ],
)
dataframe = rows.to_dataframe(
    # Optionally, explicitly request to use the BigQuery Storage API. As of
    # google-cloud-bigquery version 1.26.0 and above, the BigQuery Storage
    # API is used by default.
    create_bqstorage_client=True,
)
print(dataframe.head())

Télécharger des données de table à l'aide de la bibliothèque cliente de l'API BigQuery Storage

Utilisez directement la bibliothèque cliente de l'API BigQuery Storage pour un contrôle plus précis des filtres et du parallélisme. Lorsque seuls des filtres de lignes simples sont nécessaires, une session de lecture de l'API BigQuery Storage peut être utilisée à la place d'une requête.

Créez un objet TableReadOptions pour sélectionner des colonnes ou filtrer des lignes. Créez une session de lecture à l'aide de la méthode create_read_session.

S'il existe des flux dans la session, commencez à en lire les lignes à l'aide de la méthode read_rows. Consultez la propriété pages. Appelez la méthode to_dataframe pour convertir un message en DataFrame pandas. Pour des performances optimales, lisez à partir de plusieurs flux en parallèle. Cet exemple de code ne lit qu'un seul flux par souci de simplicité.

your_project_id = "project-for-read-session"
from google.cloud import bigquery_storage
from google.cloud.bigquery_storage import types
import pandas

bqstorageclient = bigquery_storage.BigQueryReadClient()

project_id = "bigquery-public-data"
dataset_id = "new_york_trees"
table_id = "tree_species"
table = f"projects/{project_id}/datasets/{dataset_id}/tables/{table_id}"

# Select columns to read with read options. If no read options are
# specified, the whole table is read.
read_options = types.ReadSession.TableReadOptions(
    selected_fields=["species_common_name", "fall_color"]
)

parent = "projects/{}".format(your_project_id)

requested_session = types.ReadSession(
    table=table,
    # Avro is also supported, but the Arrow data format is optimized to
    # work well with column-oriented data structures such as pandas
    # DataFrames.
    data_format=types.DataFormat.ARROW,
    read_options=read_options,
)
read_session = bqstorageclient.create_read_session(
    parent=parent, read_session=requested_session, max_stream_count=1,
)

# This example reads from only a single stream. Read from multiple streams
# to fetch data faster. Note that the session may not contain any streams
# if there are no rows to read.
stream = read_session.streams[0]
reader = bqstorageclient.read_rows(stream.name)

# Parse all Arrow blocks and create a dataframe.
frames = []
for message in reader.rows().pages:
    frames.append(message.to_dataframe())
dataframe = pandas.concat(frames)
print(dataframe.head())

Effectuer un nettoyage

Pour éviter que les ressources utilisées lors de ce tutoriel soient facturées sur votre compte Google Cloud, supprimez le projet contenant les ressources, ou conservez le projet et supprimez les ressources individuelles.

Supprimez votre projet. Vous n'avez pas créé de ressources BigQuery dans ce tutoriel, mais la suppression de votre projet supprime aussi toutes les autres ressources que vous avez créées.

  1. Dans Cloud Console, accédez à la page Gérer les ressources :

    Accéder à la page Gérer les ressources

  2. Dans la liste des projets, sélectionnez le projet que vous souhaitez supprimer, puis cliquez sur Supprimer.
  3. Dans la boîte de dialogue, saisissez l'ID du projet, puis cliquez sur Arrêter pour supprimer le projet.

Étapes suivantes