Melakukan migrasi dari paket Python datalab

Paket Python datalab digunakan untuk berinteraksi dengan layanan Google Cloud melalui notebook Datalab. Paket Python datalab menyertakan magic Jupyter dan modul Python, seperti google.datalab.bigquery, yang mendukung subset metode BigQuery API.

Library klien BigQuery, google-cloud-bigquery, adalah library Python resmi yang digunakan untuk berinteraksi dengan BigQuery. Library klien menyediakan magic sel Jupyter untuk menjalankan kueri, fungsi yang memungkinkan pengiriman dan pengambilan data menggunakan DataFrame pandas, dan library mendukung fungsi BigQuery lengkap. Contoh kode berikut menggambarkan cara melakukan operasi BigQuery umum menggunakan library google-cloud-bigquery untuk developer yang sudah terbiasa dengan paket Python datalab.

Lihat file requirements.txt untuk melihat versi library yang digunakan untuk cuplikan kode ini.

Menggunakan magic Jupyter dan perintah shell

Kedua library mendukung meng-kueri data yang tersimpan di BigQuery dengan magic sel. Perbedaan utama dalam pendekatan kedua library terhadap magic meliputi:

datalab google-cloud-bigquery
Nama magic bq bigquery
Nama ekstensi Jupyter (digunakan untuk memuat magic) google.datalab.kernel google.cloud.bigquery
Eksekusi kueri Definisi dan eksekusi kueri dapat dilakukan dalam langkah-langkah terpisah. Kueri selalu segera dieksekusi ketika perintah magic dijalankan.
Fungsionalitas yang dicakup oleh magic Beberapa fitur yang tidak didukung. Hanya kueri yang dapat dilakukan melalui magic. Untuk fungsi BigQuery lainnya, gunakan metode alat command line atau metode google.cloud.bigquery.Client.
Menyimpan hasil kueri Hasil kueri dapat disimpan ke tabel tujuan melalui magic kueri, tetapi tidak dapat disimpan ke variabel. Untuk menyimpan hasil kueri untuk suatu variabel, eksekusi kueri menggunakan python, bukan magic (lihat contoh). Hasil kueri dapat disimpan ke variabel melalui magic kueri, tetapi tidak dapat disimpan ke tabel tujuan. Untuk menyimpan hasil kueri ke tabel tujuan, jalankan kueri menggunakan python, bukan magic (lihat contoh).

Menginstal library klien Python

Untuk menginstal library klien BigQuery beserta dependensi yang diperlukan untuk menggunakan DataFrame pandas, masukkan perintah berikut di notebook Anda:

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

Mulai ulang kernel Anda setelah menginstal paket.

Memuat magic

Magic Jupyter adalah pintasan khusus notebook yang memungkinkan Anda menjalankan perintah dengan sintaksis minimal. Notebook Jupyter dilengkapi dengan banyak perintah bawaan. Paket Python datalab dan google-cloud-python menerapkan perintah magic tambahan yang dapat Anda muat ke notebook Jupyter (termasuk Datalab) untuk berinteraksi dengan Google Cloud.

datalab

Magic datalab telah dimuat sebelumnya ke dalam notebook Datalab. Untuk memuat magic di notebook Jupyter, masukkan perintah berikut:

%load_ext google.datalab.kernel

Lihat opsi lainnya untuk memuat magic di repo sumber library datalab.

google-cloud-bigquery

Untuk memuat magic BigQuery, masukkan perintah berikut:

%load_ext google.cloud.bigquery

Magic sel BigQuery akan berfungsi di notebook mana pun tempat paket google-cloud-bigquery diinstal.

Menjalankan kueri

Contoh berikut menunjukkan cara menggunakan magic sel untuk menjalankan kueri. Kedua contoh ini menjalankan kueri dan menampilkan hasilnya di bawah sel input.

datalab

Hasil kueri ditampilkan di bawah sel input.
%%bq query
SELECT word, SUM(word_count) as count
FROM `bigquery-public-data.samples.shakespeare`
GROUP BY word
ORDER BY count ASC
LIMIT 100

google-cloud-bigquery

Hasil kueri ditampilkan di bawah sel input dalam DataFrame pandas.
%%bigquery
SELECT word, SUM(word_count) as count
FROM `bigquery-public-data.samples.shakespeare`
GROUP BY word
ORDER BY count ASC
LIMIT 100

Menjalankan kueri dan menyimpan hasilnya dalam variabel

Contoh berikut menunjukkan cara menjalankan kueri, dan cara menyimpan hasilnya dalam variabel bernama my_variable.

datalab

Magic kueri datalab dapat menyimpan kueri SQL tanpa menjalankannya dengan meneruskan nama menggunakan flag --name atau -n.
%%bq query -n my_query
SELECT name FROM `bigquery-public-data.usa_names.usa_1910_current`
WHERE state = "TX"
LIMIT 100
Kueri tersimpan selanjutnya dapat dijalankan secara terpisah, dan hasilnya akan disimpan ke variabel.
import google.datalab.bigquery as bq

my_variable = my_query.execute().result().to_dataframe()

google-cloud-bigquery

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

Perintah tambahan

Library datalab berisi magic untuk berbagai jenis operasi BigQuery, sedangkan library google-cloud-bigquery memiliki satu magic sel untuk menjalankan kueri. Untuk menjalankan perintah untuk operasi selain kueri, gunakan alat command line bq. Contoh berikut menunjukkan cara menampilkan daftar semua tabel dalam set data samples dari project bigquery-public-data menggunakan magic sel datalab atau perintah shell BigQuery.

datalab

%bq tables list --dataset bigquery-public-data.samples

alat command line bq

Untuk mulai menggunakan alat command line bq yang diinstal sebagai bagian dari Google Cloud CLI, ikuti petunjuk penginstalan Google Cloud CLI. Perlu diperhatikan bahwa perintah shell dalam notebook harus diawali dengan !. Setelah alat command line bq disiapkan dan tersedia dari notebook Anda, masukkan perintah berikut, yang setara dengan magic sel datalab di atas.

!bq ls bigquery-public-data:samples

Untuk daftar lengkap perintah, masukkan perintah berikut:

!bq help

Menggunakan kode Python

Selain magic Jupyter, Anda juga dapat melakukan operasi BigQuery menggunakan metode Python di paket datalab dan google-cloud-bigquery.

Menjalankan Kueri

Kedua library mendukung menjalankan kueri dan menampilkan hasilnya sebagai DataFrame pandas.

datalab

import google.datalab.bigquery as bq

sql = """
    SELECT name FROM `bigquery-public-data.usa_names.usa_1910_current`
    WHERE state = "TX"
    LIMIT 100
"""
df = bq.Query(sql).execute().result().to_dataframe()

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
"""
df = client.query(sql).to_dataframe()

Memuat data ke tabel BigQuery

Contoh berikut menunjukkan cara membuat set data baru dan memuat data dari file CSV dari Cloud Storage ke tabel baru.

datalab

import google.datalab.bigquery as bq

# Create the dataset
dataset_id = 'import_sample'
bq.Dataset(dataset_id).create()

# Create the table
schema = [
    {'name': 'name', 'type': 'STRING'},
    {'name': 'post_abbr', 'type': 'STRING'},
]
table = bq.Table(
    '{}.us_states'.format(dataset_id)).create(schema=schema)
table.load(
    'gs://cloud-samples-data/bigquery/us-states/us-states.csv',
    mode='append',
    source_format='csv',
    csv_options=bq.CSVOptions(skip_leading_rows=1)
)  # Waits for the job to complete

google-cloud-bigquery

from google.cloud import bigquery

client = bigquery.Client(location='US')

# Create the dataset
dataset_id = 'import_sample'
dataset = client.create_dataset(dataset_id)

# Create the table
job_config = bigquery.LoadJobConfig(
    schema=[
        bigquery.SchemaField('name', 'STRING'),
        bigquery.SchemaField('post_abbr', 'STRING')
    ],
    skip_leading_rows=1,
    # The source format defaults to CSV, so the line below is optional.
    source_format=bigquery.SourceFormat.CSV
)
load_job = client.load_table_from_uri(
    'gs://cloud-samples-data/bigquery/us-states/us-states.csv',
    dataset.table('us_states'),
    job_config=job_config
)
load_job.result()  # Waits for table load to complete.

Untuk contoh lainnya tentang penggunaan library klien Python BigQuery, lihat Pemuatan batch data dan Streaming data ke BigQuery.

Memuat DataFrame pandas ke tabel BigQuery

Contoh berikut menunjukkan cara membuat set data baru dan memuat data dari DataFrame pandas ke tabel baru.

Lokasi diperlukan untuk operasi BigQuery tertentu, seperti membuat set data. Jika lokasi diberikan ke klien google-cloud-bigquery saat diinisialisasi, lokasi tersebut akan menjadi lokasi default untuk tugas, set data, dan tabel yang dibuat dengan klien. Library datalab tidak menyediakan cara untuk menentukan set data atau lokasi tugas, yang dapat menyebabkan perilaku yang tidak terduga. Lihat Lokasi set data untuk mengetahui informasi selengkapnya.

datalab

Library datalab melakukan streaming insert saat memuat data dari DataFrame pandas ke dalam tabel BigQuery. Oleh karena itu, data mungkin tidak segera tersedia untuk kueri. Lihat Streaming Data ke BigQuery untuk mengetahui informasi selengkapnya.
import google.datalab.bigquery as bq
import pandas

# Create the dataset
dataset_id = 'import_sample'
bq.Dataset(dataset_id).create()

# Create the table and load the data
dataframe = pandas.DataFrame([
    {'title': 'The Meaning of Life', 'release_year': 1983},
    {'title': 'Monty Python and the Holy Grail', 'release_year': 1975},
    {'title': 'Life of Brian', 'release_year': 1979},
    {
        'title': 'And Now for Something Completely Different',
        'release_year': 1971
    },
])
schema = bq.Schema.from_data(dataframe)
table = bq.Table(
    '{}.monty_python'.format(dataset_id)).create(schema=schema)
table.insert(dataframe)  # Starts steaming insert of data

google-cloud-bigquery

Library klien BigQuery mengonversi DataFrame pandas ke format parquet dan melakukan tugas pemuatan (bukan streaming insert). Data segera tersedia setelah tugas pemuatan selesai.
from google.cloud import bigquery
import pandas

client = bigquery.Client(location='US')

dataset_id = 'import_sample'
dataset = client.create_dataset(dataset_id)

# Create the table and load the data
dataframe = pandas.DataFrame([
    {'title': 'The Meaning of Life', 'release_year': 1983},
    {'title': 'Monty Python and the Holy Grail', 'release_year': 1975},
    {'title': 'Life of Brian', 'release_year': 1979},
    {
        'title': 'And Now for Something Completely Different',
        'release_year': 1971
    },
])
table_ref = dataset.table('monty_python')
load_job = client.load_table_from_dataframe(dataframe, table_ref)
load_job.result()  # Waits for table load to complete.