Ngân hàng đề — Google Cloud Associate Data Practitioner
Tìm thấy 333 câu.
A company wants to ingest data from its on-premises Oracle database into BigQuery for analytics. The data engineering team prefers using tools that require minimal coding and provide a visual interface for building pipelines. The tool must be able to connect to the Oracle database, allow for visual transformations, and write the data to BigQuery.
Which Google Cloud service is the best fit?
- A BigQuery Data Transfer Service
- B Dataflow
- C Database Migration Service (DMS)
- D Cloud Data Fusion
Xem giải thích
Đáp án
D — Cloud Data Fusion.
Vì sao đúng
Đề nêu bốn yêu cầu: kết nối tới Oracle tại chỗ, giao diện trực quan, ít viết mã nhất có thể, và ghi vào BigQuery. Cloud Data Fusion đáp ứng cả bốn.
⚠ Điểm mấu chốt — kéo thả từ nguồn tới đích:
Cloud Data Fusion Studio
↓
Kéo plugin "Oracle" làm nguồn
↓
Kéo các node biến đổi
(Wrangler, Joiner, Aggregator...)
↓
Kéo plugin "BigQuery" làm đích
↓
Nối các node lại rồi bấm chạy
↓
⚠ Không viết một dòng Java hay Python nào
⚠ Kết nối tới Oracle TẠI CHỖ:
Data Fusion chạy trên Google Cloud
↓
Cần đường tới máy chủ Oracle:
- Cloud VPN hoặc Interconnect
- hoặc Private Service Connect
↓
Cần JDBC DRIVER của Oracle:
⚠ tải lên Data Fusion Hub trước
(Oracle không cho phân phối lại
driver, nên phải tự thêm)
↓
Sau đó plugin Oracle hoạt động như
mọi nguồn khác
⚠ Vì sao ba phương án kia không khớp:
Database Migration Service
→ CHUYỂN CSDL sang Cloud SQL/AlloyDB
→ không phải đích BigQuery,
không có biến đổi trực quan
Dataflow
→ mạnh và linh hoạt,
nhưng phải VIẾT MÃ Apache Beam
→ trái yêu cầu "ít viết mã"
BigQuery Data Transfer Service
→ chỉ có trình kết nối cho các nguồn
SaaS và kho định sẵn
→ KHÔNG có Oracle tại chỗ,
không có biến đổi trực quan
Xem thêm câu #12915 (lô 133): cũng khoá Cloud Data Fusion vì đội giỏi SQL nhưng không lập trình. Hai câu CÙNG KHOÁ, cùng lý do — hoàn toàn nhất quán. Và #12933/#12939 (cùng lô) là các dịch vụ chuyển TỆP, khác hẳn bài toán ở đây.
Vì sao các phương án khác sai
-
B (Dataflow) — đây là phương án gần nhất về năng lực và hoàn toàn làm được, kể cả có template JDBC-to-BigQuery, nhưng biến đổi tuỳ ý đòi viết Apache Beam bằng Java hoặc Python — trái yêu cầu rõ ràng của đội.
-
C (Database Migration Service) — chuyển CSDL sang Cloud SQL / AlloyDB, không phải sang BigQuery, và không có biến đổi trực quan.
-
A (BigQuery Data Transfer Service) — không có trình kết nối cho Oracle tại chỗ, và không có bước biến đổi.
Ghi nhớ
⚠ Đưa dữ liệu từ CSDL tại chỗ vào Google Cloud — bảng phải thuộc: | Nhu cầu | Dịch vụ | |---|---| | Ít mã, giao diện trực quan, biến đổi | Cloud Data Fusion | | CDC gần thời gian thực vào BigQuery | Datastream | | Chuyển CSDL sang Cloud SQL/AlloyDB | Database Migration Service | | Biến đổi phức tạp, có đội lập trình | Dataflow | | Đã có job Spark | Dataproc | | Nguồn SaaS định sẵn → BigQuery | BigQuery Data Transfer Service |
Từ khoá nhận diện:
"kéo thả, không lập trình, Oracle → BigQuery" → Cloud Data Fusion "đồng bộ thay đổi liên tục vào BigQuery" → Datastream "Oracle → Cloud SQL" → Database Migration Service "Google Ads → BigQuery" → Data Transfer Service "S3 → GCS" → Storage Transfer Service
| Datastream — lựa chọn rất đáng cân nhắc | Nội dung |
|---|---|
| Việc | CDC — đồng bộ thay đổi gần thời gian thực |
| Nguồn | Oracle, MySQL, PostgreSQL, SQL Server |
| Đích | BigQuery (trực tiếp), Cloud Storage |
| Ưu điểm | không cần viết mã, độ trễ thấp |
| Khác Data Fusion | không có biến đổi trực quan |
| Đề này cần biến đổi | → Data Fusion |
| Cloud Data Fusion — nhắc lại | Nội dung |
|---|---|
| Nền tảng | CDAP mã nguồn mở |
| Wrangler | làm sạch dữ liệu trực quan |
| Hơn 150 plugin | nguồn, đích, biến đổi |
| Chạy trên | Dataproc tạm thời |
| ⚠ Chi phí | instance chạy THƯỜNG TRỰC — không rẻ |
| Ba phiên bản | Developer, Basic, Enterprise |
| Kết nối tới hệ thống tại chỗ | Cách |
|---|---|
| Cloud VPN | rẻ, dễ dựng, băng thông vừa |
| Dedicated / Partner Interconnect | băng thông lớn, ổn định |
| Private Service Connect | truy cập riêng tư tới dịch vụ |
| JDBC driver | phải tự tải lên với Oracle |
| Cần phối hợp | đội mạng và đội CSDL — thường là phần lâu nhất |
| Điều cần cẩn thận khi đọc từ CSDL sản xuất | Nội dung |
|---|---|
| Tải lên hệ thống nguồn | đọc theo lô lớn làm chậm ứng dụng |
| Nên | đọc từ replica, hoặc chạy ngoài giờ cao điểm |
| Đọc gia tăng | theo cột dấu thời gian, không quét cả bảng |
| CDC | ít ảnh hưởng nguồn nhất |
| Quyền | tài khoản chỉ đọc, phạm vi hẹp |
Ba việc kiểm chứng: | Việc | Cách | |---|---| | Pipeline chạy có lỗi không | Data Fusion → Pipeline runs | | Số dòng có khớp không | so COUNT(*) hai bên | | Ảnh hưởng tới Oracle thế nào | theo dõi tải trên chính máy chủ nguồn |
Và một điều nên thống nhất với đội quản trị CSDL trước khi chạy pipeline đầu tiên: đọc từ đâu và vào lúc nào. Một job Data Fusion quét toàn bộ bảng lớn trên Oracle sản xuất giữa giờ làm việc có thể làm chậm chính ứng dụng nghiệp vụ — đọc từ replica hoặc chạy ngoài giờ cao điểm là thoả thuận nên có ngay từ đầu, chứ không phải sau sự cố đầu tiên.
A data analyst team needs to query a table containing customer PII (Personally Identifiable Information), but they should only be able to see a redacted version of the customer's phone number (e.g., XXX-XXX-1234). A separate, more privileged group of users needs to see the full phone number from the same table. The underlying data must be stored in its original, plaintext format.
Which feature is designed to apply this kind of conditional, query-time redaction?
- A Cloud KMS (Key Management Service)
- B Dynamic Data Masking
- C AEAD (Authenticated Encryption with Associated Data) functions
- D CMEK (Customer-Managed Encryption Keys)
Xem giải thích
Đáp án
B — Dynamic Data Masking (che dữ liệu động).
Vì sao đúng
Đề nêu ba ràng buộc, và chỉ dynamic data masking thoả cả ba: dữ liệu gốc lưu NGUYÊN VĂN, nhóm thường thấy bản đã che, nhóm đặc quyền thấy đầy đủ — tất cả quyết định NGAY LÚC TRUY VẤN.
⚠ Điểm mấu chốt — che khi đọc, không đổi dữ liệu đã lưu:
Dữ liệu trên đĩa: 090-123-1234 (nguyên văn)
↓
Nhà phân tích thường truy vấn
↓
→ XXX-XXX-1234 (đã che)
Nhóm đặc quyền truy vấn
↓
→ 090-123-1234 (đầy đủ)
↓
⚠ CÙNG một bảng, CÙNG một câu SQL
⚠ Khác nhau ở VAI TRÒ người chạy
⚠ Cách dựng — ba bước:
1. Tạo POLICY TAG trong Dataplex/Data Catalog
ví dụ "PII / Phone"
2. Gắn tag vào cột phone_number trong lược đồ
3. Tạo DATA POLICY gắn quy tắc che vào tag đó
và cấp vai trò cho từng nhóm:
- roles/bigquerydatapolicy.maskedReader
→ thấy bản ĐÃ CHE
- roles/datacatalog.categoryFineGrainedReader
→ thấy ĐẦY ĐỦ
- không có vai trò nào → BỊ TỪ CHỐI
⚠ Các quy tắc che có sẵn:
SHA256 → băm, vẫn nối bảng được
ALWAYS_NULL → luôn trả NULL
DEFAULT_MASKING_VALUE → giá trị mặc định theo kiểu
LAST_FOUR_CHARACTERS → giữ 4 ký tự cuối ← đề này
FIRST_FOUR_CHARACTERS → giữ 4 ký tự đầu
EMAIL_MASK → che phần trước @
DATE_YEAR_MASK → chỉ giữ năm
CUSTOM (UDF) → quy tắc tự viết
Xem thêm câu #12965 (lô 134): cùng dùng policy tag, nhưng ở đó yêu cầu là CHẶN HẲN cột lương → khoá là column-level security. Câu này yêu cầu vẫn truy vấn được nhưng thấy bản che → dynamic data masking. Hai khoá khác nhau vì mức độ chặn khác nhau — không mâu thuẫn.
Vì sao các phương án khác sai
-
C (hàm AEAD) — đây là phương án gần nhất về mặt "biến đổi giá trị", nhưng AEAD mã hoá dữ liệu KHI LƯU, nên dữ liệu trên đĩa KHÔNG còn nguyên văn — trái yêu cầu. Nó cũng đòi ứng dụng tự gọi hàm giải mã.
-
A (Cloud KMS) và D (CMEK) — đều là quản lý KHOÁ mã hoá, quyết định ai giữ khoá, không liên quan tới việc hiển thị khác nhau theo vai trò người truy vấn.
Ghi nhớ
⚠ Ba cách bảo vệ cột nhạy cảm — bảng phải thuộc: | Cách | Dữ liệu lưu | Người không đủ quyền thấy gì | |---|---|---| | Column-level security | nguyên văn | BỊ TỪ CHỐI truy vấn | | Dynamic data masking | nguyên văn | giá trị ĐÃ CHE | | AEAD / mã hoá cột | BẢN MÃ | bản mã, cần khoá mới đọc được | | Cả ba | dùng chung POLICY TAG |
Từ khoá nhận diện:
"che một phần, vẫn truy vấn được, dữ liệu gốc nguyên vẹn" → dynamic data masking "chặn hẳn không cho đọc cột" → column-level security "dữ liệu phải được mã hoá trong bảng" → AEAD "ai giữ khoá mã hoá" → CMEK / Cloud KMS "chỉ thấy dòng của mình" → row-level security
| Vì sao masking hữu ích hơn ta tưởng | Lý do |
|---|---|
| Truy vấn có sẵn KHÔNG VỠ | vẫn chạy, chỉ khác giá trị |
| Dashboard dùng chung được | mỗi người thấy mức chi tiết của mình |
| SHA256 vẫn JOIN được | nối bảng mà không lộ giá trị |
| Không phải nhân bản dữ liệu | một bảng phục vụ nhiều mức quyền |
| Đổi lại | người dùng không biết mình đang xem bản che nếu không được báo |
| Các vai trò liên quan | Vai trò |
|---|---|
roles/bigquerydatapolicy.maskedReader |
thấy bản ĐÃ CHE |
roles/datacatalog.categoryFineGrainedReader |
thấy ĐẦY ĐỦ |
| Không có vai trò nào | bị từ chối truy cập cột |
| Cấp trên | policy tag, không phải trên bảng |
| Lợi ích | một tag, áp cho nhiều cột ở nhiều bảng |
| AEAD — khi nào mới cần | Trường hợp |
|---|---|
| Dữ liệu phải là bản mã ngay trong bảng | quy định rất chặt |
| Mỗi khách hàng một khoá riêng | cách ly tuyệt đối |
| Xoá khoá = xoá dữ liệu | "crypto-shredding" |
| Hàm | AEAD.ENCRYPT, AEAD.DECRYPT_STRING, KEYS.NEW_KEYSET |
| Đổi lại | ứng dụng phức tạp hơn nhiều, mất khả năng lọc và tổng hợp |
| Phòng thủ nhiều lớp cho PII | Lớp |
|---|---|
| Sensitive Data Protection | tìm ra cột nào chứa PII |
| Policy tag | phân loại mức nhạy cảm |
| Masking hoặc CLS | kiểm soát hiển thị |
| Row-level security | giới hạn phạm vi dòng |
| Data Access audit log | ai đã đọc gì |
| VPC Service Controls | chống dữ liệu ra khỏi vành đai |
Ba việc kiểm chứng: | Việc | Cách | |---|---| | Cột nào mang tag gì | bq show --schema --format=prettyjson <bảng> | | Quy tắc che là gì | Dataplex → Data policies | | Người này thấy giá trị nào | chạy thử dưới danh nghĩa tài khoản đó |
Và một điều nên thông báo rõ cho đội phân tích khi bật masking: họ đang xem bản đã che. Nếu không nói, một người thấy XXX-XXX-1234 rất dễ kết luận rằng dữ liệu nguồn bị hỏng — và đi báo một sự cố chất lượng dữ liệu không hề tồn tại.
As a data scientist for an e-commerce company, you are tasked with building a model to predict whether a customer will click on a promotional ad. The training data resides in a table named myproject.marketing_data.ad_engagement, which contains user behavior features and a BOOLEAN column named clicked_ad.
You need to train a logistic regression model to predict the value of clicked_ad, using all other columns in the table as predictive features.
Which query correctly constructs this model?
-
A
D)
CREATE MODEL `myproject.marketing_data.ad_click_model` AS SELECT * EXCEPT(clicked_ad), clicked_ad AS label FROM `myproject.marketing_data.ad_engagement`;
-
B
B)
CREATE MODEL `myproject.marketing_data.ad_click_model` OPTIONS(model_type='LOGISTIC_REG', label_column='clicked_ad') AS SELECT * EXCEPT(clicked_ad) FROM `myproject.marketing_data.ad_engagement`;
-
C
C)
CREATE MODEL `myproject.marketing_data.ad_click_model` OPTIONS(model_type='LOGISTIC_REG', input_label_cols=['clicked_ad']) AS SELECT * EXCEPT(clicked_ad) FROM `myproject.marketing_data.ad_engagement`;
-
D
A)
CREATE MODEL `myproject.marketing_data.ad_click_model` OPTIONS(model_type='LOGISTIC_REG', input_label_cols=['clicked_ad']) AS SELECT * FROM `myproject.marketing_data.ad_engagement`;
Xem giải thích
Đáp án
C — CREATE MODEL ... OPTIONS(model_type='LOGISTIC_REG', input_label_cols=['clicked_ad']) AS SELECT * EXCEPT(clicked_ad) FROM ...
Vì sao đúng
Trong bốn phương án, câu này là phương án duy nhất cùng lúc dùng ĐÚNG loại mô hình và ĐÚNG tên tuỳ chọn khai nhãn — hai điểm mà câu hỏi thật sự kiểm tra.
⚠ Điểm mấu chốt — hai tuỳ chọn bắt buộc:
model_type = 'LOGISTIC_REG'
↓
Nhãn `clicked_ad` là BOOLEAN
→ bài toán PHÂN LOẠI HAI LỚP
→ logistic regression
input_label_cols = ['clicked_ad']
↓
⚠ Tên tuỳ chọn ĐÚNG của BigQuery ML
⚠ Nhận một MẢNG, không phải chuỗi
↓
KHÔNG có tuỳ chọn nào tên `label_column`
⚠ Vì sao hai phương án kia sai chắc chắn:
Phương án B: label_column='clicked_ad'
↓
⚠ TÊN TUỲ CHỌN KHÔNG TỒN TẠI
→ BigQuery báo lỗi ngay
Phương án A: không có OPTIONS nào cả
↓
⚠ CREATE MODEL BẮT BUỘC phải có
OPTIONS(model_type=...)
→ không khai loại mô hình thì không tạo được
→ việc đặt bí danh cột thành `label`
cũng không thay thế được
⚠ Nhắc lại quy ước đặt tên nhãn của BQML:
Có HAI cách khai nhãn:
1. input_label_cols = ['ten_cot']
2. đặt tên cột là `label`
→ BQML tự nhận
↓
Không khai gì và cũng không có cột `label`
→ lỗi
Ghi nhớ về chất lượng câu hỏi
Câu này có hai lỗi soạn đề cần biết, nhưng khoá đáp án C vẫn được giữ nguyên:
Lỗi 1 — chữ cái bị xáo. Nội dung các phương án còn giữ nguyên chữ cái của bản gốc (
D),B),C),A)), không khớp với nhãn A/B/C/D hiện tại. Khi làm bài, hãy đọc nội dung chứ đừng tin vào chữ cái nằm trong nội dung.Lỗi 2 — quan trọng hơn —
SELECT * EXCEPT(clicked_ad)LOẠI BỎ chính cột nhãn. Trong BigQuery ML, cột nhãn PHẢI CÓ MẶT trong dữ liệu huấn luyện:input_label_colschỉ nói cho BQML biết cột nào trong tập dữ liệu đó là nhãn. Chạy thật câu C sẽ báo lỗi kiểu "Label column clicked_ad not found in input data".Câu chạy được trên thực tế là phương án D (
... input_label_cols=['clicked_ad'] AS SELECT * FROM ...) — giữ nguyên cột nhãn trongSELECT *.KHÔNG sửa khoá vì đây là bộ đề nguồn; nhưng khi làm việc thật, hãy nhớ:
input_label_colsKHÔNG đi kèmEXCEPTcột nhãn.
Vì sao các phương án khác sai
-
D (
input_label_cols+SELECT *) — đây là phương án gần nhất và về mặt kỹ thuật là câu chạy đúng (xem ghi chú chất lượng ở trên); trong phạm vi bộ đề, nó bị coi là sai vì được cho là "đưa cả cột nhãn vào làm đặc trưng". -
B (
label_column='clicked_ad') — tên tuỳ chọn không tồn tại trong BigQuery ML. -
A (không có
OPTIONS) — thiếumodel_type, câu lệnh không hợp lệ.
Ghi nhớ
⚠ Cú pháp CREATE MODEL — bảng phải thuộc: | Thành phần | Nội dung | |---|---| | CREATE OR REPLACE MODEL <dataset>.<ten> | tạo hoặc thay thế | | OPTIONS(model_type = '...') | BẮT BUỘC | | input_label_cols = ['ten_cot'] | khai cột nhãn — nhận MẢNG | | AS SELECT ... | dữ liệu huấn luyện, PHẢI CHỨA cột nhãn | | Quy ước thay thế | đặt tên cột là label thì không cần khai | | label_column | KHÔNG TỒN TẠI |
Từ khoá nhận diện:
"nhãn BOOLEAN, dự đoán có/không" →
LOGISTIC_REG"dự đoán giá trị số" →LINEAR_REG"khai cột nhãn" →input_label_cols=['x']"label_column" → SAI, không tồn tại "EXCEPTcột nhãn khi huấn luyện" → SAI trong thực tế
Các tuỳ chọn OPTIONS hay dùng |
Tuỳ chọn |
|---|---|
model_type |
bắt buộc |
input_label_cols |
cột nhãn |
auto_class_weights = TRUE |
cân bằng lớp — rất quan trọng với dữ liệu lệch |
data_split_method |
AUTO_SPLIT, RANDOM, SEQ, NO_SPLIT |
data_split_eval_fraction |
tỉ lệ tập kiểm định |
l1_reg / l2_reg |
điều chuẩn |
max_iterations |
số vòng lặp |
enable_global_explain = TRUE |
bật giải thích mô hình |
TRANSFORM — tính năng rất đáng dùng |
Nội dung |
|---|---|
| Việc | khai tiền xử lý NGAY TRONG mô hình |
| Ví dụ | TRANSFORM(ML.STANDARD_SCALER(gia) AS gia, ...) |
| Lợi ích | ML.PREDICT tự áp lại đúng phép biến đổi |
| Tránh được | lệch giữa lúc huấn luyện và lúc dự đoán |
| Đây là | một trong những nguồn lỗi phổ biến nhất của ML |
| Với bài toán dự đoán click quảng cáo | Nội dung |
|---|---|
| Dữ liệu rất mất cân bằng | tỉ lệ click thường vài phần trăm |
| Vì vậy | auto_class_weights = TRUE |
| Đừng nhìn accuracy | nhìn AUC, precision, recall |
| Rò rỉ dữ liệu | loại các cột chỉ có sau khi đã click |
| Đánh giá | ML.EVALUATE, ML.ROC_CURVE |
| Vòng đời một mô hình BQML | Bước |
|---|---|
| 1 | CREATE MODEL — huấn luyện |
| 2 | ML.EVALUATE — đo chất lượng |
| 3 | ML.FEATURE_IMPORTANCE — hiểu mô hình |
| 4 | ML.PREDICT — dự đoán |
| 5 | Huấn luyện lại định kỳ — chống trôi |
Ba việc kiểm chứng: | Việc | Cách | |---|---| | Mô hình huấn luyện trên cột nào | SELECT * FROM ML.FEATURE_INFO(MODEL ...) | | Mô hình tốt tới đâu | ML.EVALUATE — xem AUC | | Quá trình huấn luyện | ML.TRAINING_INFO — loss có hội tụ không |
Và một tuỳ chọn gần như luôn nên bật với bài toán dự đoán click: auto_class_weights = TRUE. Khi chỉ 2% lượt hiển thị dẫn tới click, mô hình không cân bằng lớp sẽ học được cách "không ai click bao giờ" và đạt 98% độ chính xác — một con số đẹp cho một mô hình hoàn toàn vô dụng.
A retail company is migrating its data warehouse to Google Cloud. They plan to store historical sales data in a Cloud Storage bucket. The company's security policy mandates that all data must be encrypted at rest. The IT team is small and wants to minimize operational overhead, so they need a solution where Google manages the entire encryption key lifecycle (generation, rotation, storage, and destruction) automatically, with no configuration required from their side.
Which encryption method satisfies these requirements?
-
A
Google-managed encryption keys (GMEK)
-
B
Encryption in transit
-
C
Customer-managed encryption keys (CMEK)
-
D
Customer-supplied encryption keys (CSEK)
Xem giải thích
Đáp án
A — Google-managed encryption keys (GMEK — khoá do Google quản lý).
Vì sao đúng
Đề nêu bốn điều: mã hoá khi lưu, Google lo TOÀN BỘ vòng đời khoá, giảm tối đa công vận hành, và không cần cấu hình gì. Đó chính xác là mã hoá mặc định của Google Cloud.
⚠ Điểm mấu chốt — GMEK là mặc định, có sẵn, không phải bật:
Tạo bucket Cloud Storage
↓
⚠ Dữ liệu ĐÃ ĐƯỢC MÃ HOÁ AES-256
ngay từ đối tượng đầu tiên
↓
Google lo:
- sinh khoá
- XOAY khoá tự động
- lưu khoá an toàn
- huỷ khoá khi cần
↓
⚠ Không có nút nào để bật
⚠ Cũng không có nút nào để tắt
⚠ Ba mức quản lý khoá — chọn theo mức kiểm soát CẦN có:
GMEK ← đề này
→ Google lo hết
→ 0 công vận hành
→ 0 kiểm soát
CMEK (Cloud KMS)
→ bạn tạo khoá, đặt lịch xoay,
thu hồi được
→ có công vận hành
→ cho yêu cầu TUÂN THỦ
CSEK
→ bạn gửi khoá theo từng yêu cầu
→ Google KHÔNG lưu khoá
→ công vận hành lớn nhất
⚠ Chính sách "phải mã hoá khi lưu" đã được đáp ứng sẵn:
Yêu cầu: "mọi dữ liệu phải mã hoá khi lưu"
↓
⚠ Google Cloud LUÔN làm điều này
↓
→ chính sách được thoả mà KHÔNG
cần làm gì thêm
↓
Câu hỏi thật sự chỉ còn:
có cần TỰ QUẢN khoá không?
↓
Đề nói "đội IT nhỏ, giảm công vận hành,
không cần cấu hình" → KHÔNG
Xem thêm câu #12931 (lô 133): cùng chủ đề khoá mã hoá nhưng ở đó chính sách bắt toàn quyền kiểm soát việc xoay và quản lý khoá → khoá là CMEK với Cloud KMS. Hai khoá khác nhau vì yêu cầu kiểm soát khác nhau — hoàn toàn nhất quán.
Vì sao các phương án khác sai
-
C (CMEK) — đây là phương án gần nhất và cho kiểm soát tốt hơn, nhưng nó đòi tạo key ring, tạo khoá, cấp quyền cho service agent, đặt lịch xoay, và chịu rủi ro mất khoá — trái hẳn yêu cầu "giảm tối đa công vận hành, không cấu hình gì".
-
D (CSEK) — công vận hành lớn nhất: tự quản khoá bên ngoài, gửi kèm mỗi yêu cầu; mất khoá là mất dữ liệu.
-
B (mã hoá khi truyền) — bảo vệ dữ liệu trên đường đi, không phải khi lưu. Cũng đã bật mặc định.
Ghi nhớ
⚠ Ba (bốn) mức quản lý khoá — bảng phải thuộc: | Mức | Ai tạo khoá | Công vận hành | Kiểm soát | |---|---|---|---| | GMEK | Google | KHÔNG CÓ | không | | CMEK | bạn, trong Cloud KMS | trung bình | xoay, thu hồi, vô hiệu hoá | | CSEK | bạn, bên ngoài | cao | cao nhất, ít dịch vụ hỗ trợ | | EKM | hệ thống ngoài GCP | cao | cho tuân thủ rất nghiêm ngặt |
Từ khoá nhận diện:
"không cần cấu hình, Google lo hết" → GMEK "phải tự quản việc xoay khoá" → CMEK + Cloud KMS "Google không được giữ khoá" → CSEK hoặc Cloud EKM "bảo vệ trên đường truyền" → TLS — câu hỏi khác "mã hoá khi ĐANG XỬ LÝ" → Confidential Computing
| GMEK hoạt động thế nào bên trong | Nội dung |
|---|---|
| Dữ liệu chia thành khối, mỗi khối một DEK | |
| DEK được mã hoá bằng KEK | khoá mã hoá khoá |
| KEK lưu trong hệ thống KMS nội bộ của Google | |
| Thuật toán | AES-256 |
| Xoay khoá | Google làm tự động |
| Chứng nhận | ISO, SOC, FedRAMP... — dùng được cho hầu hết yêu cầu tuân thủ |
| Khi nào GMEK là KHÔNG đủ | Trường hợp |
|---|---|
| Quy định bắt tự quản khoá | tài chính, y tế ở một số nước |
| Cần "công tắc ngắt" | vô hiệu hoá khoá = khoá dữ liệu |
| Cần audit ai dùng khoá lúc nào | Cloud KMS có audit log riêng |
| Cần khoá nằm ngoài Google | → Cloud EKM |
| Nếu không có yêu cầu nào | GMEK là lựa chọn đúng và rẻ nhất |
| Cái giá của CMEK mà đội nhỏ nên biết | Cái giá |
|---|---|
| Phải cấp quyền cho service agent của từng dịch vụ | thiếu là job hỏng |
| Khoá phải cùng Region với dữ liệu | |
| Xoá khoá = MẤT DỮ LIỆU VĨNH VIỄN | |
| Chi phí Cloud KMS | theo khoá và theo thao tác |
| Thêm một hệ thống phải vận hành | |
| Với đội IT nhỏ | rủi ro tự gây sự cố cao hơn lợi ích |
| Bảo vệ dữ liệu — lớp nào quan trọng hơn mã hoá | Lớp |
|---|---|
| IAM đúng và hẹp | nguyên nhân rò rỉ phổ biến nhất |
| Uniform bucket-level access | tắt ACL đối tượng |
| Public Access Prevention | chặn bucket công khai |
| VPC Service Controls | vành đai |
| Audit log | phát hiện bất thường |
| Thực tế | dữ liệu bị lộ vì QUYỀN SAI, hiếm khi vì thiếu mã hoá |
Ba việc kiểm chứng: | Việc | Cách | |---|---| | Bucket dùng khoá gì | gcloud storage buckets describe gs://b → defaultKmsKeyName rỗng = GMEK | | Đối tượng cụ thể | gsutil stat gs://b/obj → dòng KMS key | | Có bucket nào công khai không | Security Command Center |
Và một điều nên nhấn mạnh khi trình bày với bộ phận tuân thủ: chính sách "mã hoá khi lưu" đã được thoả ngay từ lúc tạo bucket, không cần dự án nào để triển khai. Công sức nên dồn vào phần thực sự hay gây rò rỉ — quyền truy cập quá rộng và bucket vô tình để công khai — chứ không phải vào việc dựng một hệ thống quản lý khoá mà đội chưa đủ người để vận hành an toàn.
A medical device generates sensitive health data that, according to data privacy regulations, must be de-identified on-site before any part of the data is transmitted to the cloud. A summary of the de-identified data then needs to be uploaded to Cloud Storage.
Which solution architecture meets this strict requirement?
- A Deploy an application on Google Distributed Cloud Edge to process and de-identify the data locally before uploading results.
- B Install Pub/Sub Lite on-site to stream the data to the cloud.
- C Stream the raw data to a Dataflow job that uses the Cloud Healthcare API for de-identification.
- D Use Storage Transfer Service to move the raw data to a temporary Cloud Storage bucket for processing.
Xem giải thích
Đáp án
A — Triển khai ứng dụng trên Google Distributed Cloud Edge để xử lý và khử định danh dữ liệu NGAY TẠI CHỖ trước khi tải kết quả lên.
Vì sao đúng
Ràng buộc tuyệt đối của đề là: dữ liệu phải được khử định danh TẠI CHỖ TRƯỚC KHI bất kỳ phần nào được truyền lên đám mây. Điều đó buộc việc xử lý phải xảy ra ở nơi thiết bị đang đứng.
⚠ Điểm mấu chốt — ràng buộc loại bỏ mọi kiến trúc "gửi lên rồi xử lý":
"Khử định danh TẠI CHỖ,
TRƯỚC KHI truyền bất kỳ phần nào"
↓
⚠ Mọi phương án gửi dữ liệu THÔ
lên đám mây rồi mới xử lý
→ VI PHẠM ngay ở bước truyền
↓
→ phải có NĂNG LỰC TÍNH TOÁN
tại chính cơ sở đó
↓
Google Distributed Cloud Edge
= hạ tầng Google chạy TRONG
trung tâm dữ liệu của khách hàng
⚠ Google Distributed Cloud — ý tưởng cốt lõi:
Phần cứng và phần mềm của Google
đặt TẠI CƠ SỞ của khách hàng
↓
- chạy container, VM, dịch vụ dữ liệu
- quản lý bằng công cụ quen thuộc
của Google Cloud
- có phiên bản NGẮT KẾT NỐI hoàn toàn
(air-gapped) cho yêu cầu ngặt nghèo nhất
↓
→ dữ liệu nhạy cảm KHÔNG BAO GIỜ
rời khỏi cơ sở ở dạng thô
⚠ Luồng đúng theo yêu cầu:
Thiết bị y tế sinh dữ liệu
↓
Ứng dụng trên GDC Edge (TẠI CHỖ)
- khử định danh
- tổng hợp thành bản tóm tắt
↓
⚠ Đến đây dữ liệu KHÔNG CÒN
định danh được nữa
↓
Tải bản tóm tắt lên Cloud Storage
↓
Phân tích trên đám mây bình thường
Vì sao các phương án khác sai
-
C (truyền dữ liệu thô tới Dataflow rồi khử định danh bằng Cloud Healthcare API) — đây là phương án gần nhất và là kiến trúc rất đúng đắn trong hoàn cảnh bình thường, nhưng nó truyền DỮ LIỆU THÔ lên đám mây trước — vi phạm trực tiếp điều đề cấm.
-
D (Storage Transfer Service đưa dữ liệu thô lên bucket tạm để xử lý) — cũng đưa dữ liệu thô lên đám mây; "bucket tạm" không thay đổi bản chất.
-
B (cài Pub/Sub Lite tại chỗ để truyền dữ liệu lên) — Pub/Sub Lite là dịch vụ đám mây, không cài tại chỗ được, và ngay cả nếu được thì nó cũng chỉ truyền dữ liệu thô đi.
Ghi nhớ
⚠ Xử lý dữ liệu ở đâu — bảng phải thuộc: | Ràng buộc | Kiến trúc | |---|---| | Dữ liệu KHÔNG được rời cơ sở ở dạng thô | Google Distributed Cloud (Edge / air-gapped) | | Dữ liệu phải ở trong một quốc gia | region cụ thể + Organization Policy | | Xử lý gần thiết bị để giảm độ trễ | edge computing, GDC Edge | | Không có ràng buộc vị trí | xử lý trên đám mây — đơn giản nhất | | Cần khử định danh trên đám mây | Sensitive Data Protection, Cloud Healthcare API |
Từ khoá nhận diện:
"khử định danh TẠI CHỖ trước khi truyền" → Google Distributed Cloud Edge "môi trường ngắt kết nối hoàn toàn" → GDC air-gapped "khử định danh dữ liệu y tế trên đám mây" → Cloud Healthcare API de-identification "tìm và che PII nói chung" → Sensitive Data Protection "dữ liệu phải ở trong nước" → chọn region + resourceLocations
| Các dạng Google Distributed Cloud | Dạng |
|---|---|
| GDC Edge | phần cứng đặt tại cơ sở khách hàng, kết nối với Google Cloud |
| GDC air-gapped | hoàn toàn ngắt kết nối — cho quốc phòng, chính phủ |
| GDC hosted | vận hành bởi đối tác trong nước |
| Điểm chung | API và công cụ quen thuộc của Google Cloud |
| Dùng khi | dữ liệu không được rời khỏi một ranh giới vật lý |
| Khử định danh dữ liệu y tế — các kỹ thuật | Kỹ thuật |
|---|---|
| Redaction | xoá hẳn trường định danh |
| Masking | thay bằng ký tự che |
| Tokenization | thay bằng token có thể ánh xạ ngược |
| Date shifting | dịch chuyển ngày theo một độ lệch cố định cho mỗi bệnh nhân |
| Generalization | tuổi 37 → nhóm 30–39 |
| k-anonymity, l-diversity | chống suy luận ngược từ dữ liệu tổng hợp |
| Vì sao "tổng hợp" chưa chắc là an toàn | Nội dung |
|---|---|
| Nhóm quá nhỏ | một bản ghi trong nhóm = lộ chính người đó |
| Kết hợp nhiều chiều | tuổi + mã bưu chính + giới tính đủ để định danh |
| Dữ liệu ngoại lai | giá trị cực đoan dễ nhận ra |
| Cách phòng | ngưỡng số lượng tối thiểu, k-anonymity |
| Công cụ | Sensitive Data Protection có tính k-anonymity, l-diversity |
| Cloud Healthcare API — cho dữ liệu y tế trên đám mây | Nội dung |
|---|---|
| Hỗ trợ | FHIR, HL7v2, DICOM |
| De-identification API | khử định danh có cấu hình chi tiết |
| Date shifting nhất quán theo bệnh nhân | giữ được quan hệ thời gian |
| Dùng khi | dữ liệu ĐƯỢC PHÉP lên đám mây |
| Đề này | không được phép → phải xử lý tại chỗ trước |
Ba việc kiểm chứng: | Việc | Cách | |---|---| | Dữ liệu rời cơ sở đã sạch chưa | quét bằng Sensitive Data Protection trên bản tải lên | | Có kênh nào gửi dữ liệu thô không | rà soát toàn bộ luồng mạng ra ngoài | | Có suy luận ngược được không | kiểm tra kích thước nhóm nhỏ nhất |
Và một phép kiểm tra nên chạy định kỳ ngay cả khi kiến trúc đã đúng: quét chính dữ liệu đã tải lên đám mây để tìm PII còn sót. Logic khử định danh viết đúng lúc đầu vẫn có thể bỏ lọt định danh nằm trong trường văn bản tự do — và một lần quét tự động hằng tuần là cách rẻ nhất để phát hiện điều đó trước khi kiểm toán viên phát hiện.
- A ETL Migration
- B Offline Migration
- C Batch Migration
- D Online Migration
Xem giải thích
Đáp án
D — Online Migration (di chuyển trực tuyến).
Vì sao đúng
Đề mô tả đúng hai đặc điểm của di chuyển trực tuyến: CSDL nguồn vẫn hoạt động bình thường trong suốt quá trình, và thay đổi được đồng bộ theo thời gian thực.
⚠ Điểm mấu chốt — trực tuyến ↔ ngoại tuyến:
OFFLINE MIGRATION (ngoại tuyến)
↓
1. DỪNG ứng dụng
2. Sao lưu, chuyển, khôi phục
3. Bật lại ứng dụng
↓
⚠ THỜI GIAN NGỪNG = toàn bộ
thời gian chuyển dữ liệu
→ có thể hàng giờ tới hàng ngày
ONLINE MIGRATION (trực tuyến) ← đề này
↓
1. Sao chép ban đầu (nguồn vẫn chạy)
2. CDC — bắt và phát lại thay đổi
liên tục
3. Khi độ trễ gần bằng 0 → CẮT CHUYỂN
↓
⚠ Thời gian ngừng chỉ là VÀI PHÚT
của bước cắt chuyển
⚠ CDC — cơ chế làm nên di chuyển trực tuyến:
Change Data Capture
↓
Đọc NHẬT KÝ GIAO DỊCH của CSDL nguồn
MySQL → binlog
PostgreSQL → WAL / logical replication
Oracle → redo log
↓
Phát lại các thay đổi lên đích
↓
⚠ KHÔNG cần truy vấn bảng nguồn liên tục
→ ít ảnh hưởng tới hiệu năng ứng dụng
⚠ Ba giai đoạn của một lần di chuyển trực tuyến:
1. FULL DUMP — sao chép toàn bộ dữ liệu hiện có
↓
2. CDC — bắt kịp và bám theo thay đổi
↓
Theo dõi REPLICATION LAG
↓
3. CUTOVER — khi lag gần 0:
- dừng ghi ở nguồn (vài phút)
- đợi lag về 0
- trỏ ứng dụng sang đích
- thăng cấp đích thành máy chính
Vì sao các phương án khác sai
-
B (Offline Migration) — đây là phương án đối lập trực tiếp: phải dừng CSDL nguồn trong suốt quá trình.
-
C (Batch Migration) — chuyển theo lô định kỳ, không đồng bộ thời gian thực và thường có thời gian ngừng.
-
A (ETL Migration) — không phải thuật ngữ chuẩn cho việc này; ETL là quy trình biến đổi dữ liệu cho phân tích, không phải kiểu di chuyển CSDL.
Ghi nhớ
⚠ Hai kiểu di chuyển — bảng phải thuộc: | | Online | Offline | |---|---|---| | Nguồn trong lúc chuyển | vẫn HOẠT ĐỘNG | PHẢI DỪNG | | Đồng bộ thay đổi | CDC thời gian thực | không | | Thời gian ngừng | vài phút (cắt chuyển) | toàn bộ thời gian chuyển | | Độ phức tạp | cao hơn | thấp | | Dùng khi | hệ thống quan trọng, không được ngừng lâu | dữ liệu nhỏ, chấp nhận ngừng |
Từ khoá nhận diện:
"nguồn vẫn chạy, đồng bộ thời gian thực" → online migration "dừng ứng dụng rồi chuyển" → offline migration "bắt thay đổi từ nhật ký giao dịch" → CDC "chuyển CSDL sang Cloud SQL" → Database Migration Service "đồng bộ CSDL vào BigQuery" → Datastream
| Công cụ di chuyển trực tuyến trên GCP | Công cụ |
|---|---|
| Database Migration Service | CSDL → Cloud SQL / AlloyDB, có CDC, miễn phí |
| Datastream | CDC → BigQuery, Cloud Storage |
| Nhân bản gốc của CSDL | binlog replication tự dựng |
| Storage Transfer Service | cho tệp, không phải CSDL |
| Transfer Appliance | khối lượng rất lớn, ngoại tuyến |
| Chuẩn bị trước khi di chuyển trực tuyến | Việc |
|---|---|
| Bật nhật ký giao dịch ở nguồn | binlog ROW, hoặc wal_level=logical |
| Tài khoản có quyền đọc nhật ký | |
| Đường mạng riêng | VPN, Interconnect, hoặc Private Service Connect |
| Kiểm tra tính tương thích | phiên bản, engine bảng, tính năng không hỗ trợ |
| Mọi bảng phải có KHOÁ CHÍNH | bảng không khoá chính là vấn đề lớn với CDC |
| Kế hoạch cắt chuyển (cutover) | Bước |
|---|---|
| 1 | Theo dõi replication lag tới khi gần 0 |
| 2 | Đặt ứng dụng ở chế độ chỉ đọc hoặc dừng ghi |
| 3 | Đợi lag về 0 |
| 4 | Đối chiếu số dòng và checksum |
| 5 | Thăng cấp đích, trỏ ứng dụng sang |
| 6 | Giữ nguồn thêm một thời gian để quay lui nếu cần |
| Đừng quên phần "quay lui" | Nội dung |
|---|---|
| Giữ CSDL nguồn ít nhất vài ngày | đừng xoá vội |
| Kịch bản quay lui viết sẵn | ai làm gì |
| Đo hiệu năng trên đích trước | tránh bất ngờ về tốc độ |
| Kiểm thử ứng dụng đầy đủ | chuỗi kết nối, driver, charset |
| Sai lầm | cắt chuyển vào tối thứ Sáu mà không có đường lùi |
Ba việc kiểm chứng: | Việc | Cách | |---|---| | Độ trễ nhân bản bao nhiêu | DMS console, hoặc chỉ số của Datastream | | Dữ liệu đã khớp chưa | so COUNT(*) từng bảng và checksum | | Nguồn có bị ảnh hưởng hiệu năng không | theo dõi tải trên CSDL nguồn |
Và một điều kiện kỹ thuật rất hay chặn đứng kế hoạch di chuyển trực tuyến ở phút chót: bảng không có khoá chính. CDC cần khoá để xác định dòng nào vừa thay đổi, nên những bảng thiếu khoá chính hoặc thiếu chỉ mục duy nhất thường phải xử lý riêng — kiểm tra điều này ngay từ giai đoạn khảo sát, chứ không phải khi công cụ báo lỗi.
A team is deciding between Cloud Data Fusion and Database Migration Service (DMS) for a data-moving task.
When should the team choose DMS?
- A When the goal is to replicate an entire operational MySQL database to Cloud SQL as a fully functional, transactional system.
- B When the goal is to extract data from a database, transform its structure, and load it into BigQuery for analysis.
- C When the project requires a visual, code-free interface to build a complex data transformation workflow.
- D When data needs to be loaded into BigQuery from a SaaS application like Google Ads.
Xem giải thích
Đáp án
A — Khi mục tiêu là NHÂN BẢN toàn bộ CSDL MySQL đang vận hành sang Cloud SQL thành một hệ thống GIAO DỊCH hoạt động đầy đủ.
Vì sao đúng
Database Migration Service sinh ra cho đúng một việc: chuyển một CSDL vận hành sang dịch vụ CSDL được quản lý của Google Cloud, giữ nguyên cấu trúc và tính giao dịch.
⚠ Điểm mấu chốt — DMS và Data Fusion khác nhau ở MỤC ĐÍCH:
DATABASE MIGRATION SERVICE
↓
Nguồn: MySQL, PostgreSQL, Oracle,
SQL Server
Đích: Cloud SQL, AlloyDB
↓
Mục tiêu: BẢN SAO TRUNG THÀNH
→ giữ nguyên lược đồ
→ giữ nguyên tính giao dịch
→ CSDL đích thay thế được CSDL nguồn
↓
⚠ KHÔNG biến đổi dữ liệu
CLOUD DATA FUSION
↓
Nguồn: đủ loại
Đích: BigQuery, GCS, và nhiều nơi
↓
Mục tiêu: XÂY PIPELINE PHÂN TÍCH
→ biến đổi, làm sạch, tổng hợp
→ giao diện kéo thả
⚠ Câu hỏi phân biệt đơn giản nhất:
"Đích đến có phải là một CSDL
GIAO DỊCH thay thế cho cái cũ không?"
↓
CÓ → Database Migration Service
KHÔNG (đích là kho phân tích)
→ Data Fusion, Datastream,
hoặc Dataflow
⚠ Ưu điểm của DMS trong tình huống này:
- MIỄN PHÍ với chuyển đồng nhất
(MySQL → Cloud SQL for MySQL)
- Có CDC → thời gian ngừng rất ngắn
- Tự kiểm tra tính tương thích trước
- Tự tạo instance đích
- Theo dõi replication lag trong console
- Thăng cấp đích bằng một thao tác
Xem thêm câu #12981 (lô 134): cùng so sánh các công cụ chuyển dữ liệu, nhưng ở đó đích là BigQuery và yêu cầu biến đổi trực quan không lập trình → khoá là Cloud Data Fusion. Hai khoá khác nhau vì đích và mục đích khác nhau — hai câu bổ sung cho nhau.
Vì sao các phương án khác sai
-
B (trích xuất, biến đổi cấu trúc, nạp vào BigQuery để phân tích) — đây là phương án gần nhất và mô tả đúng việc của Data Fusion hoặc Datastream, không phải DMS. DMS không đưa dữ liệu vào BigQuery và không biến đổi cấu trúc.
-
C (giao diện trực quan, không cần mã, luồng biến đổi phức tạp) — mô tả Cloud Data Fusion.
-
D (nạp vào BigQuery từ SaaS như Google Ads) — mô tả BigQuery Data Transfer Service.
Ghi nhớ
⚠ Bốn dịch vụ chuyển dữ liệu — bảng phải thuộc: | Dịch vụ | Nguồn → Đích | Mục đích | |---|---|---| | Database Migration Service | CSDL → Cloud SQL / AlloyDB | bản sao GIAO DỊCH trung thành | | Datastream | CSDL → BigQuery, GCS | CDC cho PHÂN TÍCH | | Cloud Data Fusion | nhiều nguồn → nhiều đích | ETL trực quan, có biến đổi | | BigQuery Data Transfer Service | SaaS, kho → BigQuery | nạp theo lịch | | Storage Transfer Service | kho đối tượng → GCS | chuyển TỆP |
Từ khoá nhận diện:
"MySQL → Cloud SQL, giữ nguyên giao dịch" → DMS "CSDL → BigQuery, gần thời gian thực" → Datastream "kéo thả, biến đổi, → BigQuery" → Cloud Data Fusion "Google Ads → BigQuery" → Data Transfer Service "S3 → GCS" → Storage Transfer Service
| DMS — điều cần nhớ | Nội dung |
|---|---|
| Chuyển đồng nhất (MySQL→MySQL) | MIỄN PHÍ |
| Chuyển không đồng nhất (Oracle→PostgreSQL) | có phí, phức tạp hơn |
| CDC | thời gian ngừng rất ngắn |
| Kiểm tra trước | báo trước các vấn đề tương thích |
| Kết nối | VPN, Interconnect, hoặc IP allowlist |
| Thăng cấp đích | một thao tác trong console |
| Điều kiện phía nguồn với MySQL | Điều kiện |
|---|---|
log_bin = ON |
bật nhật ký nhị phân |
binlog_format = ROW |
bắt buộc cho CDC |
binlog_row_image = FULL |
|
Tài khoản có REPLICATION SLAVE |
|
| Mọi bảng có khoá chính | rất quan trọng |
| Giữ binlog đủ lâu | tránh mất thay đổi khi chậm |
| Datastream — khi đích là BigQuery | Nội dung |
|---|---|
| Việc | CDC từ CSDL vào BigQuery gần thời gian thực |
| Nguồn | Oracle, MySQL, PostgreSQL, SQL Server |
| Ghi thẳng vào BigQuery | không cần Dataflow |
| Dùng khi | muốn phân tích trên dữ liệu vận hành mà không đụng CSDL gốc |
| Khác DMS | đích là kho phân tích, không phải CSDL thay thế |
| Mẫu kiến trúc hay gặp trong thực tế | Mẫu |
|---|---|
| DMS đưa CSDL lên Cloud SQL | hệ thống vận hành |
| Datastream đồng bộ Cloud SQL → BigQuery | phân tích |
| Dataform biến đổi trong BigQuery | mô hình dữ liệu |
| Looker Studio hiển thị | báo cáo |
| Kết quả | tách bạch OLTP và OLAP mà vẫn gần thời gian thực |
Ba việc kiểm chứng: | Việc | Cách | |---|---| | Job DMS đang ở giai đoạn nào | console → Database Migration → Migration jobs | | Độ trễ nhân bản | cùng màn hình, chỉ số replication delay | | Dữ liệu đã khớp chưa | so COUNT(*) và checksum từng bảng |
Và một cách phân biệt nhanh nếu gặp câu hỏi tương tự trong phòng thi: nhìn vào ĐÍCH. Đích là Cloud SQL hay AlloyDB thì gần như chắc chắn là Database Migration Service; đích là BigQuery hoặc Cloud Storage thì phải là Datastream, Data Fusion hoặc Dataflow — và câu hỏi chỉ còn là "có cần biến đổi không, và đội có viết mã được không".
A team is analyzing a large website_clicks table in BigQuery. They want to find the top 5 most visited pages for each day in the last month. The table contains the columns visit_date, page_path, and session_id.
Which two SQL features are essential for writing this query efficiently?
- A Window Functions (like RANK or ROW_NUMBER) and PARTITION BY
- B JOIN and UNION
- C GROUP BY and HAVING
- D Federated Queries and LIMIT
Xem giải thích
Đáp án
A — Hàm cửa sổ (như RANK hoặc ROW_NUMBER) kết hợp với PARTITION BY.
Vì sao đúng
Yêu cầu là top 5 trang được xem nhiều nhất CHO MỖI NGÀY. Cụm "top N trong từng nhóm" là dấu hiệu kinh điển của hàm cửa sổ có PARTITION BY.
⚠ Điểm mấu chốt — truy vấn đầy đủ:
WITH luot_xem AS (
SELECT visit_date, page_path,
COUNT(*) AS so_luot
FROM `du_an.website_clicks`
WHERE visit_date >= DATE_SUB(CURRENT_DATE(),
INTERVAL 30 DAY)
GROUP BY visit_date, page_path
)
SELECT visit_date, page_path, so_luot
FROM luot_xem
QUALIFY ROW_NUMBER() OVER (
PARTITION BY visit_date
ORDER BY so_luot DESC
) <= 5;
↓
GROUP BY → đếm lượt mỗi trang mỗi ngày
PARTITION BY visit_date
→ xếp hạng RIÊNG trong TỪNG NGÀY
<= 5 → lấy top 5
⚠ Vì sao chỉ GROUP BY + HAVING là KHÔNG đủ:
GROUP BY visit_date, page_path
↓
→ đếm được lượt xem mỗi trang mỗi ngày
→ ✓ bước này CẦN THIẾT
HAVING ...
↓
⚠ lọc theo GIÁ TRỊ TỔNG HỢP
(ví dụ "trên 1000 lượt")
⚠ KHÔNG diễn đạt được
"5 dòng CAO NHẤT trong mỗi nhóm"
↓
→ cần XẾP HẠNG, mà xếp hạng
trong từng nhóm là việc của
HÀM CỬA SỔ
⚠ PARTITION BY — thứ làm nên "trong mỗi ngày":
KHÔNG có PARTITION BY
↓
ROW_NUMBER() OVER (ORDER BY so_luot DESC)
↓
→ top 5 của CẢ THÁNG
→ có thể toàn của một ngày duy nhất
CÓ PARTITION BY visit_date
↓
→ mỗi ngày có riêng hạng 1..5
→ 30 ngày × 5 = 150 dòng
Xem thêm câu #12971 (lô 134): cùng họ hàm cửa sổ, ở đó là chọn
DENSE_RANK()vì yêu cầu hạng liên tục khi đồng hạng. Câu này hỏi hai tính năng cần dùng → hàm cửa sổ +PARTITION BY. Hai câu nhất quán.
Vì sao các phương án khác sai
-
C (
GROUP BYvàHAVING) — đây là phương án gần nhất vàGROUP BYthực sự cần cho bước đếm, nhưngHAVINGkhông xếp hạng được; nó chỉ lọc theo giá trị tổng hợp, không lấy được "5 cao nhất mỗi nhóm". -
B (
JOINvàUNION) — dùng để ghép bảng; ở đây chỉ có một bảng. -
D (federated query và
LIMIT) — federated query dùng cho nguồn dữ liệu ngoài;LIMITcắt tổng thể, không cắt theo từng nhóm.
Ghi nhớ
⚠ Top-N theo nhóm — bảng phải thuộc: | Bước | Công cụ | |---|---| | Đếm/tổng hợp theo nhóm | GROUP BY | | Xếp hạng TRONG từng nhóm | hàm cửa sổ + PARTITION BY | | Lọc theo hạng | QUALIFY, hoặc bọc subquery + WHERE | | Cách gọn của BigQuery | ARRAY_AGG(... ORDER BY ... LIMIT n) | | Sai lầm | dùng LIMIT — cắt tổng thể, không theo nhóm |
Từ khoá nhận diện:
"top N TRONG MỖI nhóm" → hàm cửa sổ +
PARTITION BY"tổng theo nhóm" →GROUP BY"chỉ lấy nhóm có tổng > X" →HAVING"so với dòng trước" →LAG/LEAD"cộng dồn theo thời gian" →SUM() OVER (ORDER BY ...)
| Ba hàm xếp hạng — nhắc lại | Hàm |
|---|---|
ROW_NUMBER() |
luôn khác nhau — đúng N dòng |
RANK() |
đồng hạng, có khoảng trống |
DENSE_RANK() |
đồng hạng, không khoảng trống |
Chọn ROW_NUMBER khi |
cần đúng 5 dòng |
Chọn DENSE_RANK khi |
muốn lấy hết những trang đồng hạng 5 |
QUALIFY — cú pháp rất tiện của BigQuery |
Nội dung |
|---|---|
| Việc | lọc trực tiếp trên hàm cửa sổ |
Không có QUALIFY |
phải bọc trong subquery hoặc CTE |
| Vì sao | WHERE chạy TRƯỚC SELECT, chưa có kết quả hàm cửa sổ |
| Cú pháp | QUALIFY ROW_NUMBER() OVER (...) <= 5 |
| Vị trí | sau HAVING, trước ORDER BY |
Cách viết thay thế bằng ARRAY_AGG |
Nội dung |
|---|---|
| Cú pháp | ARRAY_AGG(STRUCT(page_path, so_luot) ORDER BY so_luot DESC LIMIT 5) |
| Ưu điểm | rất hiệu quả — BigQuery tối ưu tốt |
| Kết quả | một MẢNG top 5 cho mỗi ngày |
| Trải ra | UNNEST nếu cần dạng bảng |
| Dùng khi | top-N nhỏ và muốn giữ dạng lồng |
| Tối ưu truy vấn này trên bảng lớn | Cách |
|---|---|
| Lọc theo cột PHÂN VÙNG trước | WHERE visit_date >= ... |
| Chỉ chọn cột cần | visit_date, page_path |
| Gộp trước, xếp hạng sau | giảm dữ liệu phải sắp xếp rất nhiều |
Phân cụm theo page_path |
nếu hay lọc theo trang |
| Kiểm tra | --dry_run và Execution details |
Ba việc kiểm chứng: | Việc | Cách | |---|---| | Kết quả có đúng số dòng | 30 ngày × 5 = 150 (trừ ngày ít trang) | | Có bị lẫn giữa các ngày không | kiểm tra PARTITION BY visit_date | | Đồng hạng xử lý thế nào | so ROW_NUMBER và DENSE_RANK trên cùng dữ liệu |
Và một quyết định nhỏ nhưng nên nói rõ với người đặt yêu cầu: khi hai trang có cùng số lượt ở vị trí thứ 5, báo cáo lấy một hay lấy cả hai? ROW_NUMBER cho đúng 5 dòng nhưng chọn tuỳ ý một trong hai; DENSE_RANK giữ cả hai và cho ra 6 dòng. Cả hai đều đúng — chỉ cần thống nhất trước để không phải giải thích sau.
A company adopts an ELT (Extract, Load, Transform) pattern, loading raw JSON (JavaScript Object Notation) data from its event bus directly into a staging table in BigQuery.
What is a key advantage of this approach compared to a traditional ETL (Extract, Transform, Load) pipeline?
- A It allows for the preservation of the raw, unaltered source data within the data warehouse for future reprocessing or auditing.
- B It reduces the overall storage cost because raw data is smaller than transformed data.
- C It is the only method capable of handling real-time, streaming data workloads.
- D It ensures that only perfectly structured and validated data ever enters the data warehouse.
Xem giải thích
Đáp án
A — Cho phép GIỮ LẠI dữ liệu nguồn THÔ, nguyên vẹn, ngay trong kho dữ liệu, phục vụ việc xử lý lại hoặc kiểm toán về sau.
Vì sao đúng
Đây là ưu điểm cốt lõi và thật sự của ELT: nạp dữ liệu thô vào kho trước nghĩa là bản gốc luôn còn đó, và mọi phép biến đổi đều có thể làm lại từ đầu mà không cần đụng tới hệ thống nguồn.
⚠ Điểm mấu chốt — giữ dữ liệu thô mở ra ba khả năng:
1. LOGIC BIẾN ĐỔI THAY ĐỔI
→ chạy lại từ bảng thô
→ không phải trích xuất lại từ nguồn
2. PHÁT HIỆN LỖI BIẾN ĐỔI
→ đối chiếu kết quả với dữ liệu thô
→ tìm ra sai ở bước nào
3. CÂU HỎI MỚI XUẤT HIỆN
→ trường mà bản tổng hợp đã bỏ đi
vẫn còn trong bảng thô
↓
⚠ Với ETL, cả ba đều đòi
TRÍCH XUẤT LẠI TỪ NGUỒN
⚠ Vì sao điều này đặc biệt đúng với JSON:
Dữ liệu sự kiện dạng JSON
↓
Lược đồ HAY THAY ĐỔI theo thời gian
↓
ETL: phải quyết định TRƯỚC
lấy trường nào
→ trường mới thêm sẽ bị bỏ mất
↓
ELT: nạp NGUYÊN VẸN vào kiểu JSON
hoặc STRUCT
→ trường mới vẫn nằm đó
→ khai thác được bất cứ lúc nào
⚠ Cấu trúc ba tầng đi kèm ELT:
RAW → y hệt nguồn, không sửa gì
= "bản ghi gốc" cho kiểm toán
STAGING → làm sạch, ép kiểu, loại trùng
CURATED → mô hình nghiệp vụ, bảng báo cáo
↓
Mỗi tầng dựng lại được từ tầng trước
Xem thêm câu #12958 (lô 134): cùng chủ đề, ở đó hỏi TÊN GỌI của luồng → khoá ELT. Và #12913 (lô 133): khoá ETL vì phải che PII trước khi vào kho. Ba câu nhất quán: ELT là mặc định; ETL khi có ràng buộc tuân thủ.
Vì sao các phương án khác sai
-
D (bảo đảm chỉ dữ liệu đã được kiểm chứng mới vào kho) — đây là phương án gần nhất về ngữ nghĩa, nhưng nó mô tả ưu điểm của ETL, không phải ELT. ELT làm điều ngược lại: nạp cả dữ liệu thô, kể cả phần chưa sạch.
-
B (giảm chi phí lưu trữ vì dữ liệu thô nhỏ hơn dữ liệu đã biến đổi) — sai về thực tế: ELT thường TỐN THÊM dung lượng vì giữ cả bản thô lẫn bản đã xử lý.
-
C (là cách duy nhất xử lý được dữ liệu luồng thời gian thực) — sai: cả ETL lẫn ELT đều xử lý được dữ liệu luồng; đó không phải điểm phân biệt.
Ghi nhớ
⚠ ETL ↔ ELT — bảng phải thuộc: | | ETL | ELT | |---|---|---| | Thứ tự | biến đổi TRƯỚC khi nạp | nạp trước, biến đổi sau | | Dữ liệu thô trong kho | KHÔNG | CÓ | | Chạy lại logic mới | phải lấy lại từ nguồn | chạy lại từ bảng thô | | Chi phí lưu | thấp hơn | cao hơn | | Hợp với | PII không được vào kho | hầu hết trường hợp | | Nơi biến đổi | công cụ ngoài | trong kho (BigQuery SQL) |
Từ khoá nhận diện:
"giữ dữ liệu thô để xử lý lại" → ưu điểm của ELT "chỉ dữ liệu sạch mới vào kho" → ưu điểm của ETL "che PII trước khi nạp" → bắt buộc ETL "kho mạnh, biến đổi bằng SQL" → ELT "ELT tiết kiệm dung lượng" → SAI
| Vì sao ELT trở thành mặc định | Lý do |
|---|---|
| Kho hiện đại rất mạnh | BigQuery biến đổi nhanh và rẻ |
| Lưu trữ rẻ | giữ bản thô không tốn nhiều |
| Triển khai nhanh hơn | ít hạ tầng trung gian |
| Linh hoạt | đổi logic không cần đụng nguồn |
| Công cụ hỗ trợ tốt | Dataform, dbt |
| Cái giá của ELT — nên biết trước | Cái giá |
|---|---|
| Dữ liệu thô trong kho | cần chính sách quyền chặt hơn |
| Chi phí lưu tăng | giữ nhiều tầng |
| Kho có thể thành "đầm lầy dữ liệu" | nếu không quản trị |
| Chi phí truy vấn | biến đổi chạy trên kho tính tiền |
| Khắc phục | vòng đời rõ ràng cho tầng raw, phân vùng, quyền hẹp |
| Xử lý JSON trong BigQuery | Cách |
|---|---|
Kiểu JSON gốc |
giữ nguyên, lược đồ động |
STRUCT và ARRAY |
khai tường minh, truy vấn hiệu quả hơn |
| Hàm | JSON_VALUE, JSON_QUERY, JSON_EXTRACT |
UNNEST |
trải mảng thành dòng |
| Mẫu thường dùng | raw giữ JSON, staging trải thành cột |
| Quản trị tầng raw | Việc |
|---|---|
| Phân vùng theo ngày nạp | dễ xoá, dễ chạy lại |
| Chính sách giữ bao lâu | ví dụ 13 tháng rồi sang Archive |
| Quyền rất hẹp | thô có thể chứa PII |
| Không cho báo cáo đọc trực tiếp | chỉ đọc tầng curated |
| Ghi chú nguồn gốc | tệp nào, lúc nào, phiên bản nào |
Ba việc kiểm chứng: | Việc | Cách | |---|---| | Bảng thô có nguyên vẹn không | so số dòng với nguồn | | Chạy lại có ra cùng kết quả không | kiểm thử tính lặp lại được | | Tầng raw tốn bao nhiêu | INFORMATION_SCHEMA.TABLE_STORAGE |
Và một điều nên chốt ngay khi chọn ELT, trước khi tầng raw kịp phình to: giữ dữ liệu thô bao lâu và ai được đọc nó. Không có câu trả lời cho hai câu hỏi đó, tầng raw sẽ vừa tăng chi phí đều đặn vừa trở thành nơi tập trung dữ liệu nhạy cảm mà không ai nhớ đã cấp quyền cho những ai.
You are running a Dataflow pipeline that reads data from Cloud Storage, transforms it, and writes it to BigQuery. The pipeline is running much slower than expected. When you inspect the job in the Dataflow monitoring UI, you see that the bottleneck is the final "Write to BigQuery" step.
What is a common optimization to improve the write performance of a Dataflow pipeline to BigQuery?
- A Increase the number of vCPUs on the Dataflow workers.
-
B
Use the Storage Write API
- C Set a lower num_workers value to reduce write contention.
- D Change the BigQuery table's storage from physical to logical.
Xem giải thích
Đáp án
B — Dùng Storage Write API.
Vì sao đúng
Nút thắt nằm ở bước GHI vào BigQuery, và Storage Write API là giao diện ghi thế hệ mới của BigQuery — nhanh hơn, rẻ hơn và đáng tin cậy hơn các cách ghi cũ.
⚠ Điểm mấu chốt — ba cách ghi vào BigQuery từ Dataflow:
LOAD JOB (theo lô)
→ gom thành tệp rồi nạp
→ có ĐỘ TRỄ, có hạn mức số job
→ miễn phí nhưng chậm
STREAMING INSERT (tabledata.insertAll — API CŨ)
→ ghi từng dòng
→ độ trễ thấp nhưng ĐẮT
→ giới hạn hạn mức, chỉ at-least-once
STORAGE WRITE API ← khuyến nghị
→ giao thức gRPC hiệu năng cao
→ thông lượng CAO HƠN, giá RẺ HƠN
→ hỗ trợ EXACTLY-ONCE
→ dùng chung cho cả LÔ và LUỒNG
⚠ Bật trong Dataflow:
BigQueryIO.writeTableRows()
.withMethod(BigQueryIO.Write.Method.STORAGE_WRITE_API)
.withTriggeringFrequency(Duration.standardSeconds(30))
.withNumStorageWriteApiStreams(10)
↓
⚠ Với pipeline luồng, đây thường là
thay đổi một dòng cho hiệu quả rất lớn
⚠ Vì sao tăng vCPU thường KHÔNG giải quyết được:
Nút thắt ở bước GHI
↓
→ worker đang CHỜ BigQuery nhận dữ liệu,
không phải thiếu CPU
↓
⚠ Thêm vCPU → worker chờ nhanh hơn?
→ không, chỉ tốn tiền hơn
↓
Nguyên tắc gỡ nút thắt:
SỬA ĐÚNG bước đang nghẽn,
đừng ném thêm tài nguyên vào cả job
Vì sao các phương án khác sai
-
A (tăng vCPU của worker) — đây là phản xạ thường gặp nhất, nhưng nút thắt là thông lượng ghi, không phải năng lực tính toán; thêm CPU chỉ làm tăng chi phí.
-
C (giảm
num_workersđể bớt tranh chấp ghi) — làm chậm hơn nữa; BigQuery được thiết kế để nhận ghi song song. -
D (đổi bảng từ physical sang logical storage billing) — chỉ là cách TÍNH TIỀN lưu trữ, không ảnh hưởng gì tới hiệu năng ghi.
Ghi nhớ
⚠ Các cách ghi vào BigQuery — bảng phải thuộc: | Cách | Độ trễ | Chi phí | Ghi chú | |---|---|---|---| | Load job | cao (theo lô) | miễn phí | hạn mức số job/ngày | | Streaming insert (cũ) | thấp | đắt | at-least-once | | Storage Write API | thấp | rẻ hơn streaming | exactly-once, dùng cho cả lô lẫn luồng | | Khuyến nghị hiện nay | Storage Write API cho hầu hết trường hợp |
Từ khoá nhận diện:
"ghi vào BigQuery chậm" → Storage Write API "nạp tệp lớn theo lô, miễn phí" → load job "pipeline chậm vì CPU" → mới xét tới loại máy worker "hot key, dữ liệu lệch" → sửa khoá, không phải thêm worker "trạng thái luồng lớn" → Streaming Engine
| Quy trình gỡ nút thắt pipeline Dataflow | Bước |
|---|---|
| 1 | Job graph — xác định BƯỚC nào nghẽn |
| 2 | Xem throughput vào/ra của bước đó |
| 3 | Xem CPU utilization của worker |
| 4 | CPU thấp mà vẫn chậm → nghẽn ở I/O hoặc đích |
| 5 | CPU cao → tăng worker hoặc đổi loại máy |
| 6 | Một worker chậm hẳn → dữ liệu lệch (hot key) |
| Tối ưu khác cho Dataflow | Cách |
|---|---|
| Streaming Engine | tách trạng thái khỏi worker |
| Dataflow Prime | tự điều chỉnh tài nguyên theo bước |
| Fusion | Beam tự gộp các bước — có thể cần Reshuffle để tách |
| Combiner | gộp sớm để giảm dữ liệu phải trộn |
| Side input nhỏ | tránh join lớn không cần thiết |
| Storage Write API — điều cần nhớ | Nội dung |
|---|---|
| Giao thức | gRPC, hai chiều |
| Ngữ nghĩa | exactly-once trong stream |
| Chế độ | committed (thấy ngay), pending (commit theo lô) |
| Giá | rẻ hơn streaming insert đáng kể, có mức miễn phí |
| Hỗ trợ | Dataflow, thư viện client, và Pub/Sub BigQuery subscription |
| Thay thế | API insertAll cũ |
| Khi ghi vào BigQuery vẫn chậm dù đã dùng Write API | Kiểm |
|---|---|
| Số stream ghi song song | withNumStorageWriteApiStreams |
| Lược đồ không khớp | mỗi dòng lỗi làm chậm và sinh retry |
| Bảng có quá nhiều phân vùng bị ghi cùng lúc | |
| Hạn mức của project | kiểm tra quota |
| Dead-letter | tách dòng hỏng ra thay vì để chúng làm nghẽn |
Ba việc kiểm chứng: | Việc | Cách | |---|---| | Bước nào là nút thắt | Dataflow Job graph, xem throughput từng bước | | Worker có bận không | CPU utilization trong Job metrics | | Ghi có bị lỗi dòng không | log của bước ghi và bảng dead-letter |
Và một nguyên tắc đáng nhớ mỗi khi một pipeline chạy chậm: đọc biểu đồ trước khi thêm tài nguyên. Nếu CPU của worker chỉ ở mức thấp mà job vẫn ì ạch, vấn đề gần như chắc chắn nằm ở đầu vào hoặc đầu ra chứ không ở năng lực tính toán — và tăng số worker trong tình huống đó chỉ tạo ra thêm những worker cùng ngồi chờ.