Perbandingan dengan pandas-gbq

Library pandas-gbq menyediakan antarmuka sederhana untuk menjalankan kueri dan mengupload dataframe pandas ke BigQuery. Library ini adalah wrapper tipis di sekitar library klien BigQuery, google-cloud-bigquery. Kedua library ini berfokus untuk membantu Anda melakukan analisis data menggunakan SQL. Topik ini memberikan contoh kode yang membandingkan google-cloud-bigquery dan pandas-gbq.

Perbedaan utama dalam tingkat fungsi dan dukungan antara kedua library tersebut meliputi:

panda-gbq google-cloud-bigquery
Support Library open source yang dikelola oleh PyData dan kontributor sukarelawan Library open source yang dikelola oleh Google
Fungsi BigQuery API yang tercakup Menjalankan kueri dan menyimpan data dari pandas DataFrames ke tabel Fungsi penuh BigQuery API, dengan dukungan tambahan untuk membaca/menulis DataFrames pandas dan Jupyter magic untuk menjalankan kueri
docs / sumber docs / sumber

Menginstal library

Untuk menggunakan contoh kode dalam panduan ini, instal paket pandas-gbq dan library klien Python BigQuery.

PIP

Instal paket pandas-gbq dan google-cloud-bigquery.

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

Conda

Instal paket Conda pandas-gbq dan google-cloud-bigquery dari saluran conda-forge yang dikelola komunitas.

conda install -c conda-forge pandas-gbq google-cloud-bigquery

Menjalankan Kueri

Kedua library mendukung pembuatan kueri data yang tersimpan di BigQuery. Perbedaan utama antar-library meliputi:

panda-gbq google-cloud-bigquery
Sintaksis SQL default GoogleSQL (dapat dikonfigurasi dengan pandas_gbq.context.dialect) GoogleSQL
Konfigurasi kueri Dikirim sebagai kamus dalam format yang ditentukan dalam referensi REST BigQuery. Gunakan class QueryJobConfig, yang berisi properti untuk berbagai opsi konfigurasi API.

Membuat kueri data dengan sintaks GoogleSQL

Contoh berikut menunjukkan cara menjalankan kueri GoogleSQL dengan dan tanpa menentukan project secara eksplisit. Untuk kedua library, jika project tidak ditentukan, project akan ditentukan dari kredensial default.

pandas-gbq:

import pandas

sql = """
    SELECT name
    FROM `bigquery-public-data.usa_names.usa_1910_current`
    WHERE state = 'TX'
    LIMIT 100
"""

# Run a Standard SQL query using the environment's default project
df = pandas.read_gbq(sql, dialect="standard")

# Run a Standard SQL query with the project set explicitly
project_id = "your-project-id"
df = pandas.read_gbq(sql, project_id=project_id, dialect="standard")

google-cloud-bigquery:

from google.cloud import bigquery

client = bigquery.Client()
sql = """
    SELECT name
    FROM `bigquery-public-data.usa_names.usa_1910_current`
    WHERE state = 'TX'
    LIMIT 100
"""

# Run a Standard SQL query using the environment's default project
df = client.query(sql).to_dataframe()

# Run a Standard SQL query with the project set explicitly
project_id = "your-project-id"
df = client.query(sql, project=project_id).to_dataframe()

Membuat kueri data dengan sintaksis legacy SQL

Contoh berikut menunjukkan cara menjalankan kueri menggunakan sintaksis legacy SQL. Lihat panduan migrasi GoogleSQL untuk mendapatkan panduan tentang cara memperbarui kueri ke GoogleSQL.

pandas-gbq:

import pandas

sql = """
    SELECT name
    FROM [bigquery-public-data:usa_names.usa_1910_current]
    WHERE state = 'TX'
    LIMIT 100
"""

df = pandas.read_gbq(sql, dialect="legacy")

google-cloud-bigquery:

from google.cloud import bigquery

client = bigquery.Client()
sql = """
    SELECT name
    FROM [bigquery-public-data:usa_names.usa_1910_current]
    WHERE state = 'TX'
    LIMIT 100
"""
query_config = bigquery.QueryJobConfig(use_legacy_sql=True)

df = client.query(sql, job_config=query_config).to_dataframe()

Menggunakan BigQuery Storage API untuk mendownload hasil dalam jumlah besar

Gunakan BigQuery Storage API untuk mempercepat download hasil besar sebanyak 15 hingga 31 kali.

pandas-gbq:

import pandas

sql = "SELECT * FROM `bigquery-public-data.irs_990.irs_990_2012`"

# Use the BigQuery Storage API to download results more quickly.
df = pandas.read_gbq(sql, dialect="standard", use_bqstorage_api=True)

google-cloud-bigquery:

from google.cloud import bigquery

client = bigquery.Client()
sql = "SELECT * FROM `bigquery-public-data.irs_990.irs_990_2012`"

# The client library uses the BigQuery Storage API to download results to a
# pandas dataframe if the API is enabled on the project, the
# `google-cloud-bigquery-storage` package is installed, and the `pyarrow`
# package is installed.
df = client.query(sql).to_dataframe()

Menjalankan kueri dengan konfigurasi

Pengiriman konfigurasi dengan permintaan BigQuery API diperlukan untuk melakukan operasi kompleks tertentu, seperti menjalankan kueri berparameter atau menentukan tabel tujuan untuk menyimpan hasil kueri. Di pandas-gbq, konfigurasi harus dikirim sebagai kamus dalam format yang ditentukan dalam referensi REST BigQuery. Di google-cloud-bigquery, class konfigurasi tugas disediakan, seperti QueryJobConfig, yang berisi properti yang diperlukan untuk mengonfigurasi tugas yang kompleks.

Contoh berikut menunjukkan cara menjalankan kueri dengan parameter bernama.

pandas-gbq:

import pandas

sql = """
    SELECT name
    FROM `bigquery-public-data.usa_names.usa_1910_current`
    WHERE state = @state
    LIMIT @limit
"""
query_config = {
    "query": {
        "parameterMode": "NAMED",
        "queryParameters": [
            {
                "name": "state",
                "parameterType": {"type": "STRING"},
                "parameterValue": {"value": "TX"},
            },
            {
                "name": "limit",
                "parameterType": {"type": "INTEGER"},
                "parameterValue": {"value": 100},
            },
        ],
    }
}

df = pandas.read_gbq(sql, configuration=query_config)

google-cloud-bigquery:

from google.cloud import bigquery

client = bigquery.Client()
sql = """
    SELECT name
    FROM `bigquery-public-data.usa_names.usa_1910_current`
    WHERE state = @state
    LIMIT @limit
"""
query_config = bigquery.QueryJobConfig(
    query_parameters=[
        bigquery.ScalarQueryParameter("state", "STRING", "TX"),
        bigquery.ScalarQueryParameter("limit", "INTEGER", 100),
    ]
)

df = client.query(sql, job_config=query_config).to_dataframe()

Memuat DataFrame pandas ke tabel BigQuery

Kedua library mendukung upload data dari DataFrame pandas ke tabel baru di BigQuery. Perbedaan utamanya meliputi:

panda-gbq google-cloud-bigquery
Dukungan jenis Mengonversi DataFrame menjadi format CSV sebelum mengirim ke API, yang tidak mendukung nilai susun bertingkat atau array. Mengonversi DataFrame ke format Parquet atau CSV sebelum mengirim ke API, yang mendukung nilai bertingkat dan array. Pilih Parquet untuk nilai struct dan array serta CSV untuk fleksibilitas serialisasi tanggal dan waktu. Parquet adalah pilihan default-nya. Perhatikan bahwa pyarrow, yang merupakan mesin parquet yang digunakan untuk mengirim data DataFrame ke BigQuery API, harus diinstal untuk memuat DataFrame ke tabel.
Memuat konfigurasi Dikirim sebagai kamus dalam format yang ditentukan dalam referensi REST BigQuery. Gunakan class LoadJobConfig, yang berisi properti untuk berbagai opsi konfigurasi API.

pandas-gbq:

import pandas

df = pandas.DataFrame(
    {
        "my_string": ["a", "b", "c"],
        "my_int64": [1, 2, 3],
        "my_float64": [4.0, 5.0, 6.0],
        "my_timestamp": [
            pandas.Timestamp("1998-09-04T16:03:14"),
            pandas.Timestamp("2010-09-13T12:03:45"),
            pandas.Timestamp("2015-10-02T16:00:00"),
        ],
    }
)
table_id = "my_dataset.new_table"

df.to_gbq(table_id)

google-cloud-bigquery:

Paket google-cloud-bigquery memerlukan library pyarrow untuk melakukan serialisasi pandas DataFrame ke file Parquet.

Menginstal paket pyarrow

 conda install -c conda-forge pyarrow

atau

 pip install pyarrow

from google.cloud import bigquery
import pandas

df = pandas.DataFrame(
    {
        "my_string": ["a", "b", "c"],
        "my_int64": [1, 2, 3],
        "my_float64": [4.0, 5.0, 6.0],
        "my_timestamp": [
            pandas.Timestamp("1998-09-04T16:03:14"),
            pandas.Timestamp("2010-09-13T12:03:45"),
            pandas.Timestamp("2015-10-02T16:00:00"),
        ],
    }
)
client = bigquery.Client()
table_id = "my_dataset.new_table"
# Since string columns use the "object" dtype, pass in a (partial) schema
# to ensure the correct BigQuery data type.
job_config = bigquery.LoadJobConfig(
    schema=[
        bigquery.SchemaField("my_string", "STRING"),
    ]
)

job = client.load_table_from_dataframe(df, table_id, job_config=job_config)

# Wait for the load job to complete.
job.result()

Fitur yang tidak didukung oleh pandas-gbq

Meskipun library pandas-gbq menyediakan antarmuka yang berguna untuk membuat kueri data dan menulis data ke tabel, library ini tidak mencakup banyak fitur BigQuery API, termasuk, tetapi tidak terbatas pada: