BigQuery-Daten mithilfe der BigQuery Storage API in pandas herunterladen

Die BigQuery Storage API ermöglicht den schnellen Zugriff auf Daten, die in BigQuery gespeichert sind. Mit der BigQuery Storage API können Sie in BigQuery gespeicherte Daten herunterladen, um sie in Analysetools wie der pandas-Bibliothek für Python zu verwenden.

Ziele

In dieser Anleitung können Sie:

  • Abfrageergebnisse mithilfe der BigQuery Storage API aus den magischen IPython-Befehlen für BigQuery in einem Jupyter-Notebook in einen pandas-DataFrame herunterladen.
  • Abfrageergebnisse mithilfe der BigQuery-Clientbibliothek für Python in einen pandas-DataFrame herunterladen.
  • Tabellendaten aus BigQuery mithilfe der BigQuery-Clientbibliothek für Python in einen pandas-DataFrame herunterladen.
  • Tabellendaten aus BigQuery mithilfe der BigQuery Storage API-Clientbibliothek für Python in einen pandas-DataFrame herunterladen.

Kosten

BigQuery ist ein kostenpflichtiges Produkt. Für die von Ihnen ausgeführten Abfragen fallen BigQuery-Nutzungskosten an. Das erste Terabyte (1 TB) an verarbeiteten Abfragedaten pro Monat ist kostenlos. Weitere Informationen finden Sie auf der Seite "Preise" für BigQuery.

Die BigQuery Storage API ist ein kostenpflichtiges Produkt. Für die von Ihnen beim Herunterladen eines DataFrames gescannten Tabellendaten fallen Nutzungskosten an. Weitere Informationen finden Sie auf der Seite "Preise" für BigQuery.

Vorbereitung

Bevor Sie mit dieser Anleitung beginnen, rufen Sie die Google Cloud Console auf, erstellen Sie dort ein Projekt oder wählen es aus und aktivieren Sie die Abrechnung.

  1. Melden Sie sich bei Ihrem Google Cloud-Konto an. Wenn Sie mit Google Cloud noch nicht vertraut sind, erstellen Sie ein Konto, um die Leistungsfähigkeit unserer Produkte in der Praxis sehen und bewerten zu können. Neukunden erhalten außerdem ein Guthaben von 300 $, um Arbeitslasten auszuführen, zu testen und bereitzustellen.
  2. Wählen Sie in der Google Cloud Console auf der Seite der Projektauswahl ein Google Cloud-Projekt aus oder erstellen Sie eines.

    Zur Projektauswahl

  3. Die Abrechnung für das Cloud-Projekt muss aktiviert sein. So prüfen Sie, ob die Abrechnung für Ihr Projekt aktiviert ist.

  4. BigQuery ist in neuen Projekten automatisch aktiviert. So aktivieren Sie BigQuery in einem vorhandenen Projekt: BigQuery, BigQuery Storage API APIs aktivieren.

    Aktivieren Sie die APIs

  5. Richten Sie eine Python-Entwicklungsumgebung ein.
    Python einrichten
  6. Richten Sie die Authentifizierung für Ihre Entwicklungsumgebung ein.
    Authentifizierung einrichten

Sie sollten außerdem mit den magischen IPython-Befehlen für BigQuery, der BigQuery-Clientbibliothek und der Verwendung der Clientbibliothek mit pandas vertraut sein, bevor Sie diese Anleitung durcharbeiten.

Clientbibliotheken installieren

Installieren Sie mindestens Version 1.9.0 der BigQuery-Python-Clientbibliothek und die Python-Clientbibliothek der BigQuery Storage API.

PIP

Installieren Sie die Pakete google-cloud-bigquery und google-cloud-bigquery-storage.

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

Conda

Installieren Sie die Conda-Pakete für BigQuery und die BigQuery Storage API aus dem Community-Kanal conda-forge.

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

Abfrageergebnisse mit den magischen IPython-Befehlen für BigQuery herunterladen

Starten Sie den Jupyter-Notebook-Server und erstellen Sie ein neues Jupyter-Notebook. Laden Sie die magischen IPython-Befehle für BigQuery mithilfe des magischen Befehls %load_ext.

%load_ext google.cloud.bigquery

Ab Version 1.26.0 des Python-Pakets google-cloud-bigquery wird die BigQuery Storage API standardmäßig verwendet, um Ergebnisse aus den magischen Befehlen von %%bigquery herunterzuladen.

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

Python-Clientbibliotheken verwenden

Abfrageergebnisse mithilfe der BigQuery-Clientbibliothek herunterladen

Führen Sie mit der Methode query eine Abfrage aus. Rufen Sie die Methode to_dataframe auf. Damit werden die Ergebnisse mithilfe der BigQuery Storage API vollständig heruntergeladen.

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())

Tabellendaten mithilfe der BigQuery-Clientbibliothek herunterladen

Mit der Methode list_rows können Sie alle Zeilen in einer Tabelle herunterladen. Dabei wird ein RowIterator-Objekt zurückgegeben. Laden Sie Zeilen mit der BigQuery Storage API herunter. Dazu rufen Sie die Methode to_dataframe mit dem Argument bqstorage_client auf.

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())

Tabellendaten mithilfe der BigQuery Storage API-Clientbibliothek herunterladen

Für eine präzise Steuerung der Filter und des Parallelismus verwenden Sie direkt die BigQuery Storage API-Clientbibliothek. Wenn nur einfache Zeilenfilter erforderlich sind, kann anstelle einer Abfrage eine BigQuery Storage API-Lesesitzung verwendet werden.

Erstellen Sie ein TableReadOptions-Objekt, um Spalten oder Filterzeilen auszuwählen. Erstellen Sie mit der Methode create_read_session eine Lesesitzung.

Wenn sich in der Sitzung Streams befinden, lesen Sie die Zeilen mit der Methode read_rows. Schleife über das Attribut pages. Rufen Sie die Methode to_dataframe auf, um eine Nachricht in einen Pandas DataFrame zu konvertieren. Lesen Sie für eine bessere Leistung parallel aus mehreren Streams. In diesem Codebeispiel wird jedoch der Einfachheit halber nur aus einem einzigen Stream gelesen.

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())

Bereinigen

Damit Ihrem Google Cloud-Konto die in dieser Anleitung verwendeten Ressourcen nicht in Rechnung gestellt werden, löschen Sie entweder das Projekt, das die Ressourcen enthält, oder Sie behalten das Projekt und löschen die einzelnen Ressourcen.

Löschen Sie das Projekt. Sie haben in dieser Anleitung keine BigQuery-Ressourcen erstellt. Durch das Löschen Ihres Projekts werden jedoch alle anderen von Ihnen erstellten Ressourcen entfernt.

  1. Wechseln Sie in der Cloud Console zur Seite Ressourcen verwalten.

    Zur Seite „Ressourcen verwalten“

  2. Wählen Sie in der Projektliste das Projekt aus, das Sie löschen möchten, und klicken Sie dann auf Löschen.
  3. Geben Sie im Dialogfeld die Projekt-ID ein und klicken Sie auf Shut down (Beenden), um das Projekt zu löschen.

Weitere Informationen