Sử dụng BigQuery với Python

1. Tổng quan

BigQuery là kho dữ liệu phân tích cỡ petabyte và chi phí thấp do Google quản lý hoàn toàn. BigQuery là NoOps – không có cơ sở hạ tầng để quản lý và bạn không cần quản trị viên cơ sở dữ liệu – vì vậy, bạn có thể tập trung vào việc phân tích dữ liệu để tìm thông tin chi tiết có ý nghĩa, sử dụng SQL quen thuộc và tận dụng mô hình trả tiền theo mức dùng của chúng tôi.

Trong lớp học lập trình này, bạn sẽ sử dụng Thư viện ứng dụng Google Cloud dành cho Python để truy vấn các tập dữ liệu công khai BigQuery bằng Python.

Kiến thức bạn sẽ học được

  • Cách sử dụng Cloud Shell
  • Cách bật BigQuery API
  • Cách xác thực yêu cầu API
  • Cách cài đặt thư viện ứng dụng Python
  • Cách truy vấn các tác phẩm của Shakespeare
  • Cách truy vấn tập dữ liệu GitHub
  • Cách điều chỉnh việc lưu vào bộ nhớ đệm và thống kê hiển thị

Bạn cần có

  • Một dự án trong Google Cloud
  • Một trình duyệt, chẳng hạn như Chrome hoặc Firefox
  • Quen thuộc với Python

Khảo sát

Bạn sẽ sử dụng hướng dẫn này như thế nào?

Chỉ có thể đọc Đọc và hoàn thành bài tập

Bạn đánh giá thế nào về trải nghiệm sử dụng Python?

Người mới tập Trung cấp Thành thạo

Bạn đánh giá thế nào về trải nghiệm sử dụng các dịch vụ của Google Cloud?

Người mới tập Trung cấp Thành thạo

2. Thiết lập và yêu cầu

Thiết lập môi trường theo tiến độ riêng

  1. Đăng nhập vào Google Cloud Console rồi tạo dự án mới hoặc sử dụng lại dự án hiện có. Nếu chưa có tài khoản Gmail hoặc Google Workspace, bạn phải tạo một tài khoản.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • Tên dự án là tên hiển thị của những người tham gia dự án này. Đây là một chuỗi ký tự không được API của Google sử dụng và bạn có thể cập nhật chuỗi này bất cứ lúc nào.
  • Mã dự án phải là duy nhất trong tất cả các dự án Google Cloud và không thể thay đổi (bạn không thể thay đổi mã này sau khi đặt). Cloud Console sẽ tự động tạo một chuỗi duy nhất; thường bạn không quan tâm đến sản phẩm đó là gì. Trong hầu hết các lớp học lập trình, bạn sẽ cần tham chiếu đến Mã dự án (và mã này thường được xác định là PROJECT_ID). Vì vậy, nếu không thích, bạn có thể tạo một mã ngẫu nhiên khác hoặc bạn có thể thử mã của riêng mình để xem có mã này chưa. Sau đó, video sẽ được "đóng băng" sau khi tạo dự án.
  • Có giá trị thứ ba là Project Number (Số dự án) mà một số API sử dụng. Tìm hiểu thêm về cả ba giá trị này trong tài liệu này.
  1. Tiếp theo, bạn sẽ cần bật tính năng thanh toán trong Cloud Console để sử dụng tài nguyên/API trên Cloud. Việc chạy qua lớp học lập trình này sẽ không tốn nhiều chi phí. Để tắt các tài nguyên để bạn không phải chịu thanh toán ngoài hướng dẫn này, hãy làm theo mọi thao tác "dọn dẹp" hướng dẫn ở cuối lớp học lập trình. Người dùng mới của Google Cloud đủ điều kiện tham gia chương trình Dùng thử miễn phí 300 USD.

Khởi động Cloud Shell

Mặc dù bạn có thể vận hành Google Cloud từ xa trên máy tính xách tay, nhưng trong lớp học lập trình này, bạn sẽ sử dụng Google Cloud Shell, một môi trường dòng lệnh chạy trong Đám mây.

Kích hoạt Cloud Shell

  1. Trong Cloud Console, hãy nhấp vào Kích hoạt Cloud Shell 853e55310c205094.pngs.

55efc1aaa7a4d3ad.pngS

Nếu trước đây bạn chưa từng khởi động Cloud Shell, thì bạn sẽ thấy một màn hình trung gian (dưới màn hình đầu tiên) mô tả về ứng dụng này. Nếu trường hợp đó xảy ra, hãy nhấp vào Tiếp tục (và bạn sẽ không thấy thông báo đó nữa). Màn hình một lần đó sẽ có dạng như sau:

9c92662c6a846a5c.pngS

Quá trình cấp phép và kết nối với Cloud Shell chỉ mất vài phút.

9f0e51b578fecce5.pngs

Máy ảo này chứa tất cả các công cụ phát triển mà bạn cần. Dịch vụ này cung cấp thư mục gốc 5 GB ổn định và chạy trong Google Cloud, giúp nâng cao đáng kể hiệu suất và khả năng xác thực của mạng. Trong lớp học lập trình này, đa số mọi người đều có thể thực hiện chỉ bằng một trình duyệt hoặc Chromebook.

Sau khi kết nối với Cloud Shell, bạn sẽ thấy mình đã được xác thực và dự án đã được đặt thành mã dự án.

  1. Chạy lệnh sau trong Cloud Shell để xác nhận rằng bạn đã được xác thực:
gcloud auth list

Kết quả lệnh

 Credentialed Accounts
ACTIVE  ACCOUNT
*       <my_account>@<my_domain.com>

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. Chạy lệnh sau trong Cloud Shell để xác nhận rằng lệnh gcloud biết về dự án của bạn:
gcloud config list project

Kết quả lệnh

[core]
project = <PROJECT_ID>

Nếu chưa, bạn có thể thiết lập chế độ này bằng lệnh sau:

gcloud config set project <PROJECT_ID>

Kết quả lệnh

Updated property [core/project].

3. Bật API

BigQuery API phải được bật theo mặc định trong tất cả dự án trên Google Cloud. Bạn có thể kiểm tra xem điều này có đúng hay không bằng lệnh sau trong Cloud Shell: Bạn phải là BigQuery được liệt kê:

gcloud services list

Bạn sẽ thấy BigQuery được liệt kê:

NAME                              TITLE
bigquery.googleapis.com           BigQuery API

...

Trong trường hợp chưa bật BigQuery API, bạn có thể sử dụng lệnh sau trong Cloud Shell để bật:

gcloud services enable bigquery.googleapis.com

4. Xác thực các yêu cầu API

Để gửi yêu cầu đến BigQuery API, bạn cần sử dụng Tài khoản dịch vụ. Tài khoản dịch vụ thuộc về dự án của bạn và thư viện ứng dụng Google Cloud Python dùng tài khoản này để tạo các yêu cầu API BigQuery. Giống như mọi tài khoản người dùng khác, tài khoản dịch vụ được đại diện bằng địa chỉ email. Trong phần này, bạn sẽ sử dụng Cloud SDK để tạo một tài khoản dịch vụ, sau đó tạo thông tin xác thực mà bạn cần để xác thực là tài khoản dịch vụ.

Trước tiên, hãy đặt một biến môi trường PROJECT_ID:

export PROJECT_ID=$(gcloud config get-value core/project)

Tiếp theo, hãy tạo một tài khoản dịch vụ mới để truy cập vào BigQuery API bằng cách sử dụng:

gcloud iam service-accounts create my-bigquery-sa \
  --display-name "my bigquery service account"

Tiếp theo, hãy tạo thông tin đăng nhập mà mã Python sẽ sử dụng để đăng nhập làm tài khoản dịch vụ mới của bạn. Tạo các thông tin đăng nhập này và lưu dưới dạng tệp JSON ~/key.json bằng cách sử dụng lệnh sau:

gcloud iam service-accounts keys create ~/key.json \
  --iam-account my-bigquery-sa@${PROJECT_ID}.iam.gserviceaccount.com

Cuối cùng, hãy đặt biến môi trường GOOGLE_APPLICATION_CREDENTIALS mà thư viện ứng dụng BigQuery Python sử dụng (được đề cập trong bước tiếp theo) để tìm thông tin đăng nhập của bạn. Bạn phải đặt biến môi trường thành đường dẫn đầy đủ của tệp JSON chứa thông tin đăng nhập mà bạn đã tạo bằng cách sử dụng:

export GOOGLE_APPLICATION_CREDENTIALS=~/key.json

Bạn có thể đọc thêm về cách xác thực BigQuery API.

5. Thiết lập kiểm soát quyền truy cập

BigQuery sử dụng giải pháp Quản lý danh tính và quyền truy cập (IAM) để quản lý quyền truy cập vào tài nguyên. BigQuery có một số vai trò được xác định trước (người dùng, dataOwner, dataViewer, v.v.) mà bạn có thể chỉ định cho tài khoản dịch vụ mà bạn đã tạo ở bước trước đó. Bạn có thể đọc thêm về Kiểm soát quyền truy cập trong tài liệu về BigQuery.

Trước khi có thể truy vấn các tập dữ liệu công khai, bạn cần đảm bảo tài khoản dịch vụ có ít nhất vai trò roles/bigquery.user. Trong Cloud Shell, hãy chạy lệnh sau để chỉ định vai trò của người dùng cho tài khoản dịch vụ:

gcloud projects add-iam-policy-binding ${PROJECT_ID} \
  --member "serviceAccount:my-bigquery-sa@${PROJECT_ID}.iam.gserviceaccount.com" \
  --role "roles/bigquery.user"

Bạn có thể chạy lệnh sau để xác minh rằng tài khoản dịch vụ có vai trò người dùng:

gcloud projects get-iam-policy $PROJECT_ID

Bạn sẽ thấy những thông tin sau:

bindings:
- members:
  - serviceAccount:my-bigquery-sa@<PROJECT_ID>.iam.gserviceaccount.com
  role: roles/bigquery.user
...

6. Cài đặt thư viện ứng dụng

Cài đặt thư viện ứng dụng BigQuery Python:

pip3 install --user --upgrade google-cloud-bigquery

Giờ đây, bạn đã sẵn sàng lập trình bằng API BigQuery!

7. Truy vấn các tác phẩm của Shakespeare

Tập dữ liệu công khai là bất kỳ tập dữ liệu nào được lưu trữ trong BigQuery và được cung cấp công khai. Có nhiều tập dữ liệu công khai khác để bạn truy vấn. Mặc dù một số tập dữ liệu được Google lưu trữ, nhưng hầu hết đều do các bên thứ ba lưu trữ. Để biết thêm thông tin, hãy xem trang Tập dữ liệu công khai.

Ngoài các tập dữ liệu công khai, BigQuery còn cung cấp một số lượng bảng mẫu hạn chế để bạn có thể truy vấn. Các bảng này nằm trong tập dữ liệu bigquery-public-data:samples. Bảng shakespeare trong tập dữ liệu samples có chứa một chỉ mục từ ngữ của các tác phẩm của Shakespeare. Hàm này cho biết số lần mỗi từ xuất hiện trong mỗi tập sao lục.

Ở bước này, bạn sẽ truy vấn bảng shakespeare.

Trước tiên, trong Cloud Shell, hãy tạo một ứng dụng Python đơn giản mà bạn sẽ dùng để chạy các mẫu Translation API.

mkdir bigquery-demo
cd bigquery-demo
touch app.py

Mở trình soạn thảo mã ở trên cùng bên phải của Cloud Shell:

b648141af44811a3.png

Chuyển đến tệp app.py bên trong thư mục bigquery-demo rồi thay thế mã bằng đoạn mã sau.

from google.cloud import bigquery

client = bigquery.Client()

query = """
    SELECT corpus AS title, COUNT(word) AS unique_words
    FROM `bigquery-public-data.samples.shakespeare`
    GROUP BY title
    ORDER BY unique_words
    DESC LIMIT 10
"""
results = client.query(query)

for row in results:
    title = row['title']
    unique_words = row['unique_words']
    print(f'{title:<20} | {unique_words}')

Hãy dành một hoặc hai phút để nghiên cứu mã và xem cách bảng đang được truy vấn.

Quay lại Cloud Shell, chạy ứng dụng:

python3 app.py

Bạn sẽ thấy danh sách các từ và số lần xuất hiện của các từ đó:

hamlet               | 5318
kinghenryv           | 5104
cymbeline            | 4875
troilusandcressida   | 4795
kinglear             | 4784
kingrichardiii       | 4713
2kinghenryvi         | 4683
coriolanus           | 4653
2kinghenryiv         | 4605
antonyandcleopatra   | 4582

8. Truy vấn tập dữ liệu GitHub

Để làm quen với BigQuery, bây giờ, bạn sẽ đưa ra một truy vấn dựa trên tập dữ liệu công khai GitHub. Bạn sẽ tìm thấy những thông báo cam kết phổ biến nhất trên GitHub. Bạn cũng sẽ sử dụng Bảng điều khiển web của BigQuery để xem trước và chạy các truy vấn đặc biệt.

Để xem dữ liệu trông như thế nào, hãy mở tập dữ liệu GitHub trong giao diện người dùng web BigQuery:

Mở bảng github_repos

Nhấp vào nút Xem trước để xem dữ liệu trông như thế nào:

d3f0dc7400fbe678.png

Chuyển đến tệp app.py bên trong thư mục bigquery_demo rồi thay thế mã bằng đoạn mã sau.

from google.cloud import bigquery

client = bigquery.Client()

query = """
    SELECT subject AS subject, COUNT(*) AS num_duplicates
    FROM bigquery-public-data.github_repos.commits
    GROUP BY subject
    ORDER BY num_duplicates
    DESC LIMIT 10
"""
results = client.query(query)

for row in results:
    subject = row['subject']
    num_duplicates = row['num_duplicates']
    print(f'{subject:<20} | {num_duplicates:>9,}')

Hãy dành vài phút để nghiên cứu mã và xem cách bảng đang được truy vấn cho các thông báo xác nhận phổ biến nhất.

Quay lại Cloud Shell, chạy ứng dụng:

python3 app.py

Bạn sẽ thấy danh sách thông báo cam kết và số lần xuất hiện của các thông báo đó:

Update README.md     | 1,685,515
Initial commit       | 1,577,543
update               |   211,017
                     |   155,280
Create README.md     |   153,711
Add files via upload |   152,354
initial commit       |   145,224
first commit         |   110,314
Update index.html    |    91,893
Update README        |    88,862

9. Lưu vào bộ nhớ đệm và số liệu thống kê

BigQuery lưu kết quả của các truy vấn vào bộ nhớ đệm. Do đó, các truy vấn tiếp theo mất ít thời gian hơn. Bạn có thể tắt chức năng lưu vào bộ nhớ đệm bằng các tuỳ chọn truy vấn. BigQuery cũng theo dõi số liệu thống kê về các truy vấn như thời gian tạo, thời gian kết thúc, tổng số byte được xử lý.

Trong bước này, bạn sẽ tắt chức năng lưu vào bộ nhớ đệm và cũng hiển thị số liệu thống kê về truy vấn.

Chuyển đến tệp app.py bên trong thư mục bigquery_demo rồi thay thế mã bằng đoạn mã sau.

from google.cloud import bigquery

client = bigquery.Client()

query = """
    SELECT subject AS subject, COUNT(*) AS num_duplicates
    FROM bigquery-public-data.github_repos.commits
    GROUP BY subject
    ORDER BY num_duplicates
    DESC LIMIT 10
"""
job_config = bigquery.job.QueryJobConfig(use_query_cache=False)
results = client.query(query, job_config=job_config)

for row in results:
    subject = row['subject']
    num_duplicates = row['num_duplicates']
    print(f'{subject:<20} | {num_duplicates:>9,}')

print('-'*60)
print(f'Created: {results.created}')
print(f'Ended:   {results.ended}')
print(f'Bytes:   {results.total_bytes_processed:,}')

Một số điều cần lưu ý về mã. Trước tiên, tính năng lưu vào bộ nhớ đệm sẽ bị tắt bằng cách sử dụng QueryJobConfig và đặt use_query_cache thành false. Thứ hai, bạn đã truy cập vào số liệu thống kê về truy vấn từ đối tượng công việc.

Quay lại Cloud Shell, chạy ứng dụng:

python3 app.py

Giống như trước đó, bạn sẽ thấy danh sách các thông báo cam kết và số lần xuất hiện của các thông báo đó. Ngoài ra, cuối cùng bạn cũng sẽ thấy một vài số liệu thống kê về truy vấn:

Update README.md     | 1,685,515
Initial commit       | 1,577,543
update               |   211,017
                     |   155,280
Create README.md     |   153,711
Add files via upload |   152,354
initial commit       |   145,224
first commit         |   110,314
Update index.html    |    91,893
Update README        |    88,862
------------------------------------------------------------
Created: 2020-04-03 13:30:08.801000+00:00
Ended:   2020-04-03 13:30:15.334000+00:00
Bytes:   2,868,251,894

10. Đang tải dữ liệu vào BigQuery

Nếu muốn truy vấn dữ liệu của riêng mình, bạn cần tải dữ liệu đó vào BigQuery. BigQuery hỗ trợ tải dữ liệu từ nhiều nguồn, bao gồm Cloud Storage, các dịch vụ khác của Google và các nguồn có thể đọc khác. Bạn thậm chí có thể truyền trực tuyến dữ liệu của mình bằng cách sử dụng các phương thức truyền trực tuyến. Để biết thêm thông tin, hãy xem trang Tải dữ liệu vào BigQuery.

Ở bước này, bạn sẽ tải tệp JSON được lưu trữ trên Cloud Storage vào bảng BigQuery. Tệp JSON nằm tại gs://cloud-samples-data/bigquery/us-states/us-states.json

Nếu muốn biết nội dung của tệp JSON, bạn có thể sử dụng công cụ dòng lệnh gsutil để tải tệp này xuống trong Cloud Shell:

gsutil cp gs://cloud-samples-data/bigquery/us-states/us-states.json .

Bạn có thể thấy tệp này chứa danh sách các tiểu bang của Hoa Kỳ và mỗi tiểu bang là một tài liệu JSON trên một dòng riêng:

head us-states.json
{"name": "Alabama", "post_abbr": "AL"}
{"name": "Alaska", "post_abbr":  "AK"}
...

Để tải tệp JSON này vào BigQuery, hãy chuyển đến tệp app.py bên trong thư mục bigquery_demo rồi thay thế mã bằng đoạn mã sau.

from google.cloud import bigquery

client = bigquery.Client()

gcs_uri = 'gs://cloud-samples-data/bigquery/us-states/us-states.json'

dataset = client.create_dataset('us_states_dataset')
table = dataset.table('us_states_table')

job_config = bigquery.job.LoadJobConfig()
job_config.schema = [
    bigquery.SchemaField('name', 'STRING'),
    bigquery.SchemaField('post_abbr', 'STRING'),
]
job_config.source_format = bigquery.SourceFormat.NEWLINE_DELIMITED_JSON

load_job = client.load_table_from_uri(gcs_uri, table, job_config=job_config)

print('JSON file loaded to BigQuery')

Hãy dành 2 phút để tìm hiểu cách mã tải tệp JSON và tạo bảng có giản đồ trong tập dữ liệu.

Quay lại Cloud Shell, chạy ứng dụng:

python3 app.py

Một tập dữ liệu và một bảng sẽ được tạo trong BigQuery.

Để xác minh rằng tập dữ liệu đã được tạo, hãy chuyển đến bảng điều khiển BigQuery. Bạn sẽ thấy một tập dữ liệu và bảng mới. Chuyển sang thẻ xem trước của bảng để xem dữ liệu:

8c7d2621820a5ac4.png.

11. Xin chúc mừng!

Bạn đã tìm hiểu cách sử dụng BigQuery với Python!

Dọn dẹp

Để tránh bị tính phí vào tài khoản Google Cloud của bạn cho các tài nguyên được sử dụng trong hướng dẫn này:

  • Trong Cloud Console, hãy chuyển đến trang Quản lý tài nguyên.
  • Trong danh sách dự án, hãy chọn dự án rồi nhấp vào Delete (Xoá).
  • Trong hộp thoại, hãy nhập mã dự án rồi nhấp vào Tắt để xoá dự án.

Tìm hiểu thêm

Giấy phép

Tác phẩm này được cấp phép theo Giấy phép chung Ghi nhận tác giả Creative Commons 2.0.