從 datalab Python 套件遷移

datalab Python 套件用於透過 Cloud Datalab 筆記本與 Google Cloud Platform 服務互動。datalab Python 套件包含 Jupyter 神奇指令和 Python 模組 (例如 google.datalab.bigquery),可支援一部分 BigQuery API 方法。

BigQuery 用戶端程式庫 google-cloud-bigquery 則是 Python 用來與 BigQuery 互動的官方程式庫。該用戶端程式庫提供了 Jupyter 神奇儲存格指令,可用來執行查詢,此外也提供允許使用 pandas DataFrame 傳送和擷取資料的函式,該程式庫支援完整的 BigQuery 功能。下列程式碼範例為已熟悉 datalab Python 套件的開發人員說明了如何使用 google-cloud-bigquery 程式庫來執行常見的 BigQuery 作業。

請參閱 requirements.txt 檔案以查看用於這些程式碼片段的程式庫版本。

使用 Jupyter 神奇指令和殼層指令

這兩個程式庫都支援透過神奇儲存格指令,查詢儲存在 BigQuery 中的資料。兩個程式庫使用神奇指令方法的主要差異包括:

datalab google-cloud-bigquery
神奇指令名稱 bq bigquery
Jupyter 副檔名 (用於載入神奇指令) google.datalab.kernel google.cloud.bigquery
查詢執行 查詢定義和執行可以在不同的步驟中執行。 執行神奇指令時,一律會立即執行查詢。
神奇指令涵蓋的功能 不支援某些功能。 只有查詢可以透過神奇指令執行。對於其他 BigQuery 功能,請使用指令列工具google.cloud.bigquery.Client 方法。
儲存查詢結果 查詢結果可透過查詢神奇指令來儲存到目的地資料表,但無法儲存到變數。如要針對變數儲存查詢結果,請使用 Python 而非神奇指令來執行查詢 (參閱範例)。 查詢結果可透過查詢神奇指令來儲存到變數,但無法儲存到目的地資料表。如要將查詢結果儲存到目的地資料表,請使用 Python 而非神奇指令來執行查詢 (參閱範例)。

安裝 Python 用戶端程式庫

如要安裝 BigQuery 用戶端程式庫並使用 pandas DataFrame 所需的依附元件,請在筆記本中輸入下列指令:

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

載入神奇指令

Jupyter 神奇指令是筆記本專用的捷徑,可讓您以最少的語法執行指令。Jupyter 筆記本已預先載入許多內建指令datalabgoogle-cloud-python Python 套件實作了額外的神奇指令,您可以將指令載入 Jupyter 筆記本 (包括 Cloud Datalab),藉此與 Google Cloud Platform 互動。

datalab

Cloud Datalab 筆記本中已預先載入 datalab 神奇指令。如要在 Jupyter 筆記本中載入神奇指令,請輸入下列指令:

%load_ext google.datalab.kernel

您可以在 datalab 程式庫原始碼存放區中看到載入神奇指令的更多選項。

google-cloud-bigquery

如要載入 BigQuery 神奇指令,請輸入下列指令:

%load_ext google.cloud.bigquery

BigQuery 神奇儲存格指令適用於任何已安裝 google-cloud-bigquery 套件的筆記本。如要使用神奇儲存格指令,您必須使用 0.32.0 以上版本的用戶端程式庫。

執行查詢

下列範例說明如何使用神奇儲存格指令來執行查詢。兩個範例都會執行查詢並在輸入儲存格下方顯示結果。

datalab

查詢結果會以 QueryResultsTable 的形式顯示在輸入儲存格下方。
%%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

查詢結果會顯示在 pandas DataFrame 中的輸入儲存格下方。
%%bigquery
SELECT word, SUM(word_count) as count
FROM `bigquery-public-data.samples.shakespeare`
GROUP BY word
ORDER BY count ASC
LIMIT 100

執行查詢並將結果儲存在變數中

下列範例說明如何執行查詢,以及如何將結果儲存在名為 my_variable 的變數中。

datalab

datalab 查詢神奇指令可透過傳送具有 --name-n 標記的名稱來儲存 SQL 查詢,無需執行該查詢。
%%bq query -n my_query
SELECT name FROM `bigquery-public-data.usa_names.usa_1910_current`
WHERE state = "TX"
LIMIT 100
然後便可以分開執行已儲存的查詢,並將結果儲存到變數中。
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

執行參數化查詢

下列範例說明如何執行參數化查詢。執行參數化查詢可讓您定義查詢參數,並在不同的儲存格中執行查詢。詳情請參閱執行參數化查詢

datalab

定義查詢。
%%bq query -n my_query
SELECT word, SUM(word_count) as count
FROM `bigquery-public-data.samples.shakespeare`
WHERE corpus = @corpus_name
GROUP BY word
ORDER BY count ASC
LIMIT @limit
設定參數。
corpus_name = "hamlet"
limit = 10
執行查詢。
%%bq execute -q my_query --to-dataframe
parameters:
- name: corpus_name
  type: STRING
  value: $corpus_name
- name: limit
  type: INTEGER
  value: $limit

google-cloud-bigquery

定義參數。
params = {"corpus_name": "hamlet", "limit": 10}
定義並執行查詢。
%%bigquery --params $params
SELECT word, SUM(word_count) as count
FROM `bigquery-public-data.samples.shakespeare`
WHERE corpus = @corpus_name
GROUP BY word
ORDER BY count ASC
LIMIT @limit

其他指令

datalab 程式庫包含適用於許多 BigQuery 作業類型的神奇指令,而 google-cloud-bigquery 程式庫則有一個適用於執行查詢的神奇儲存格指令。如要針對查詢以外的作業執行指令,請使用 BigQuery 指令列工具。下列範例說明如何使用 datalab 神奇儲存格指令或 BigQuery 殼層指令,以列出 bigquery-public-data 專案的 samples 資料集中的所有資料表。

datalab

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

BigQuery 指令列工具

如要開始使用隨著 Cloud SDK 一併安裝的 BigQuery 指令列工具,請按照 Cloud SDK 安裝操作說明進行。請注意,筆記本中的殼層指令前面必須加上 !。BigQuery 指令列工具設定完畢並可從筆記本使用後,請輸入下列指令,該指令相當於上述的 datalab 神奇儲存格指令。

!bq ls bigquery-public-data:samples

如需完整的指令清單,請輸入下列指令:

!bq help

使用 Python 程式碼

除了 Jupyter 神奇指令外,您也可以在 datalabgoogle-cloud-bigquery 套件中使用 Python 方法來執行 BigQuery 作業。

執行查詢

這兩個程式庫都支援執行查詢並以 pandas DataFrame 的形式傳回結果。

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

將資料載入 BigQuery 表格

下列範例說明如何建立新的資料集,並將資料從 Cloud Storage 中的 CSV 檔案載入新的資料表。

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.

如需使用 BigQuery Python 用戶端程式庫的更多範例,請參閱從 Cloud Storage 載入資料將資料從本機資料來源載入到 BigQuery將資料串流到 BigQuery 等文。

將 pandas DataFrame 載入 BigQuery 表格

下列範例說明如何建立新的資料集,並將資料從 pandas DataFrame 載入新的資料表。

某些 BigQuery 作業 (例如建立資料集) 需要位置。如果在初始化 google-cloud-bigquery 用戶端時提供了位置,該位置就會成為使用該用戶端建立的工作、資料集和資料表的預設位置。datalab 程式庫並未提供指定資料集或工作位置的方法,這可能會導致非預期的行為。詳情請參閱資料集位置

datalab

將資料從 pandas DataFrame 載入 BigQuery 表格時,datalab 程式庫會執行串流資料插入。因此,查詢可能無法立即取得資料。詳情請參閱以串流方式將資料傳入 BigQuery
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

BigQuery 用戶端程式庫會將 pandas DataFrame 轉換為 parquet 格式並執行載入工作 (而不是串流資料插入)。完成載入工作後,就可以立即使用資料。
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.
本頁內容對您是否有任何幫助?請提供意見:

傳送您對下列選項的寶貴意見...

這個網頁