1. Tổng quan
BigQuery là kho dữ liệu phân tích cỡ petabyte, tiết kiệm chi phí và do Google toàn quyền quản lý. BigQuery là NoOps (không cần quản lý cơ sở hạ tầng và bạn không cần quản trị viên cơ sở dữ liệu) nên 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ẽ dùng Thư viện ứng dụng Google Cloud cho Python để truy vấn 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 cá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 trên GitHub
- Cách điều chỉnh bộ nhớ đệm và số liệu thống kê hiển thị
Bạn cần có
- Một dự án trên Google Cloud
- Một trình duyệt, chẳng hạn như Chrome hoặc Firefox
- Làm quen với cách sử dụng Python
Bản khảo sát
Bạn sẽ sử dụng hướng dẫn này như thế nào?
Bạn đánh giá thế nào về trải nghiệm của mình với Python?
Bạn đánh giá thế nào về trải nghiệm khi sử dụng các dịch vụ của Google Cloud?
2. Thiết lập và yêu cầu
Thiết lập môi trường theo tốc độ của riêng bạn
- Đăng nhập vào Google Cloud Console rồi tạo một dự án mới hoặc sử dụng lại một 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.



- 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ự mà các API của Google không 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 trên tất cả các dự án trên Google Cloud và không thể thay đổi (bạn không thể thay đổi sau khi đã đặt). Cloud Console sẽ tự động tạo một chuỗi duy nhất; thường thì bạn không cần quan tâm đến chuỗi này. 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 (thường được xác định là
PROJECT_ID). Vì vậy, nếu không thích mã này, bạn có thể tạo một mã ngẫu nhiên khác hoặc thử mã của riêng mình để xem mã đó có dùng được hay không. Sau đó, mã này sẽ "đóng băng" sau khi dự án được tạo. - Có một giá trị thứ ba là Số dự án mà một số API sử dụng. Tìm hiểu thêm về cả 3 giá trị này trong tài liệu.
- Tiếp theo, bạn cần bật tính năng thanh toán trong Cloud Console để sử dụng các tài nguyên/API trên Cloud. Việc thực hiện lớp học lập trình này sẽ không tốn nhiều chi phí, nếu có. Để tắt các tài nguyên nhằm tránh bị tính phí ngoài phạm vi hướng dẫn này, hãy làm theo mọi hướng dẫn "dọn dẹp" ở 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í trị giá 300 USD.
Khởi động Cloud Shell
Mặc dù 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 trên Cloud.
Kích hoạt Cloud Shell
- Trong Cloud Console, hãy nhấp vào Kích hoạt Cloud Shell
.

Nếu chưa từng khởi động Cloud Shell, bạn sẽ thấy một màn hình trung gian (bên dưới phần hiển thị đầu tiên) mô tả về Cloud Shell. Nếu vậy, hãy nhấp vào Tiếp tục (và bạn sẽ không bao giờ thấy màn hình này nữa). Sau đây là giao diện của màn hình xuất hiện một lần:

Quá trình cung cấp và kết nối với Cloud Shell chỉ mất vài giây.

Máy ảo này được trang bị tất cả các công cụ phát triển mà bạn cần. Nền tảng này cung cấp một thư mục chính có dung lượng 5 GB và chạy trong Google Cloud, giúp tăng cường đáng kể hiệu suất mạng và hoạt động xác thực. Bạn có thể thực hiện hầu hết, nếu không muốn nói là tất cả, công việc trong lớp học lập trình này 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 rằng mình đã được xác thực và dự án đã được đặt thành mã dự án của bạn.
- Chạy lệnh sau trong Cloud Shell để xác nhận rằng bạn đã được xác thực:
gcloud auth list
Đầu ra của lệnh
Credentialed Accounts
ACTIVE ACCOUNT
* <my_account>@<my_domain.com>
To set the active account, run:
$ gcloud config set account `ACCOUNT`
- 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
Đầu ra của lệnh
[core] project = <PROJECT_ID>
Nếu không, bạn có thể đặt nó bằng lệnh sau:
gcloud config set project <PROJECT_ID>
Đầu ra của lệnh
Updated property [core/project].
3. Bật API
Theo mặc định, BigQuery API sẽ được bật trong tất cả cá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 được liệt kê trong BigQuery:
gcloud services list
Bạn sẽ thấy BigQuery trong danh sách:
NAME TITLE bigquery.googleapis.com BigQuery API ...
Trong trường hợp BigQuery API chưa được bật, bạn có thể dùng lệnh sau trong Cloud Shell để bật API này:
gcloud services enable bigquery.googleapis.com
4. Xác thực các yêu cầu API
Để đưa ra yêu cầu cho 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à được thư viện ứng dụng Python của Google Cloud dùng để đưa ra 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 biểu thị bằng một đị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 đăng nhập mà bạn cần để xác thực dưới dạng 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ẽ dùng để đăng nhập dưới dạng tài khoản dịch vụ mới. Tạo 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. Thư viện ứng dụng BigQuery Python (được đề cập trong bước tiếp theo) sẽ dùng biến này để tìm thông tin đăng nhập của bạn. Bạn nên đặ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 tính năng kiểm soát quyền truy cập
BigQuery sử dụng dịch vụ Quản lý danh tính và quyền truy cập (IAM) để quản lý quyền truy cập vào các tài nguyên. BigQuery có một số vai trò được xác định trước (user, 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ề Quyền kiểm soát truy cập trong tài liệu 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ò 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 BigQuery API!
7. Truy vấn các tác phẩm của Shakespeare
Tập dữ liệu công khai là tập dữ liệu được lưu trữ trong BigQuery và cung cấp cho công chúng. Bạn có thể truy vấn nhiều tập dữ liệu công khai khác. Mặc dù một số tập dữ liệu do Google lưu trữ, nhưng hầu hết đều do 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 hạn chế bảng mẫu mà 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 chứa một chỉ mục từ của các tác phẩm của Shakespeare. Nó cho biết số lần xuất hiện của mỗi từ trong mỗi ngữ liệu.
Trong 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ã ở phía trên cùng bên phải của Cloud Shell:

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 truy vấn bảng.
Trong Cloud Shell, hãy 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 chúng:
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 trên GitHub
Để làm quen hơn với BigQuery, giờ đây, bạn sẽ đưa ra một truy vấn đối với tập dữ liệu công khai của GitHub. Bạn sẽ tìm thấy những thông báo xác nhận phổ biến nhất trên GitHub. Bạn cũng sẽ sử dụng Bảng điều khiển trê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:
Nhấp vào nút Xem trước để xem dữ liệu trông như thế nào:

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,}')
Dành một hoặc hai phút để nghiên cứu mã và xem cách bảng được truy vấn để tìm các thông báo cam kết phổ biến nhất.
Trong Cloud Shell, hãy chạy ứng dụng:
python3 app.py
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 chúng:
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 sẽ mất ít thời gian hơn. Bạn có thể tắt tính năng lưu vào bộ nhớ đệm bằng các lựa chọn truy vấn. BigQuery cũng theo dõi số liệu thống kê về các truy vấn, chẳng hạ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 tính năng lưu vào bộ nhớ đệm và hiển thị số liệu thống kê về các 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ã này. Trước tiên, hãy tắt tính năng lưu vào bộ nhớ đệm bằng cách giới thiệu 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.
Trong Cloud Shell, hãy chạy ứng dụng:
python3 app.py
Giống như trước đây, 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 chúng. Ngoài ra, bạn cũng sẽ thấy một số số liệu thống kê về cụm từ tìm kiếm ở cuối:
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. 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 cả Cloud Storage, các dịch vụ khác của Google và những nguồn có thể đọc khác. Bạn thậm chí có thể truyền trực tuyến dữ liệu bằng cách sử dụng tính năng chèn luồng phát. Để biết thêm thông tin, hãy xem trang Tải dữ liệu vào BigQuery.
Trong bước này, bạn sẽ tải một tệp JSON được lưu trữ trên Cloud Storage vào một bảng BigQuery. Tệp JSON nằm ở 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ể 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 rằng 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 biệt:
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')
Dành một hoặc hai phút để nghiên cứu cách mã tải tệp JSON và tạo một bảng có giản đồ trong một tập dữ liệu.
Trong Cloud Shell, hãy chạy ứng dụng:
python3 app.py
Một tập dữ liệu và một bảng đượ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:

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 phát sinh phí cho tài khoản Google Cloud của bạn đối với các tài nguyên được dùng trong hướng dẫn này, hãy làm như sau:
- 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 của bạn rồi nhấp vào 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
- Google BigQuery: https://cloud.google.com/bigquery/docs/
- Python trên Google Cloud: https://cloud.google.com/python/
- Thư viện ứng dụng đám mây cho Python: https://googleapis.github.io/google-cloud-python/
Giấy phép
Tác phẩm này được cấp phép theo giấy phép Ghi công theo Creative Commons 2.0 Chung.