Ngân hàng đề — Google Cloud Professional Data Engineer
Tìm thấy 429 câu.
- A Get more training examples
- B Reduce the number of training examples
- C Use a smaller set of features
- D Use a larger set of features
- E Increase the regularization parameters
- F Decrease the regularization parameters
Xem giải thích
🧩 Phân tích nội dung câu hỏi
Câu hỏi này thuộc chủ đề Machine Learning trên AWS, cụ thể là xử lý vấn đề overfitting (quá khớp dữ liệu huấn luyện) khi xây dựng mô hình phân loại spam (spam classifier). Overfitting xảy ra khi mô hình học thuộc lòng dữ liệu huấn luyện (training data) quá tốt, dẫn đến hiệu suất kém trên dữ liệu mới (test data), thường biểu hiện qua độ chính xác cao trên train nhưng thấp trên validation/test.
Câu hỏi yêu cầu chọn ba hành động (Choose three) để khắc phục overfitting. Đây là kiến thức cơ bản trong AWS SageMaker hoặc các dịch vụ ML của AWS (cập nhật đến phiên bản mới nhất năm 2026, theo AWS ML Best Practices và SageMaker documentation), nơi overfitting được giải quyết bằng cách giảm độ phức tạp mô hình, tăng dữ liệu, hoặc tăng regularization.
📘 Tài liệu tham khảo:
- AWS SageMaker Documentation: Handling Overfitting (cập nhật 2026).
- AWS Certified Machine Learning - Specialty Exam Guide: Phần Model Tuning & Optimization.
✅ Đáp án đúng và lý do lựa chọn
Ba đáp án đúng là:
- Get more training examples
- Use a smaller set of features
- Increase the regularization parameters
Lý do lựa chọn: Những hành động này trực tiếp giảm độ phức tạp của mô hình và tăng khả năng tổng quát hóa (generalization). Tăng dữ liệu giúp mô hình học đa dạng hơn; giảm features loại bỏ noise; tăng regularization phạt các tham số lớn, ngăn chặn overfitting. Đây là các phương pháp chuẩn theo AWS ML pipeline (như trong SageMaker Hyperparameter Tuning Jobs).
🛠️ Giải thích chi tiết tất cả các phương án
Dưới đây là phân tích từng phương án một cách đầy đủ, giữ nguyên văn bản gốc bằng tiếng Anh. Mỗi phương án được đánh dấu ✅ (đúng) hoặc ❌ (sai), kèm giải thích rõ ràng bằng tiếng Việt dựa trên nguyên tắc ML hiện đại (2026).
-
✅ Get more training examples
🧠 Đúng: Tăng số lượng ví dụ huấn luyện giúp mô hình tiếp xúc với nhiều biến thể dữ liệu hơn, giảm nguy cơ học thuộc lòng. Trong AWS SageMaker, bạn có thể sử dụng Data Augmentation hoặc S3 datasets lớn hơn để scale data, cải thiện generalization đáng kể. -
❌ Reduce the number of training examples
🚫 Sai: Giảm dữ liệu huấn luyện làm mô hình dễ overfitting hơn vì thiếu đa dạng, dẫn đến variance cao. Điều này trái ngược hoàn toàn với best practices của AWS, nơi khuyến nghị scale data thay vì cắt giảm. -
✅ Use a smaller set of features
🧠 Đúng: Giảm số lượng đặc trưng (features) làm mô hình đơn giản hơn, loại bỏ noise và correlation không cần thiết. Trong AWS, áp dụng Feature Selection (như SageMaker Feature Store hoặc PCA) để tránh curse of dimensionality, hiệu quả chống overfitting. -
❌ Use a larger set of features
🚫 Sai: Tăng features làm tăng độ phức tạp mô hình (high-dimensional data), dễ dẫn đến overfitting do học noise thay vì pattern thực. AWS cảnh báo về điều này trong SageMaker Processing Jobs, khuyến nghị dimensionality reduction. -
✅ Increase the regularization parameters
🧠 Đúng: Tăng lambda (regularization strength) trong L1/L2 regularization phạt các trọng số lớn, buộc mô hình đơn giản hóa. AWS SageMaker hỗ trợ tuning hyperparameters này qua Automated Model Tuning, là cách phổ biến nhất để chống overfitting (cập nhật 2026 với Elastic Fabric Adapter cho training lớn). -
❌ Decrease the regularization parameters
🚫 Sai: Giảm regularization cho phép mô hình phức tạp hơn (under-penalized), làm trầm trọng hóa overfitting. Trong AWS, điều này thường gây under-regularization, dẫn đến high training accuracy nhưng low test accuracy – hoàn toàn ngược lại mục tiêu.
🏆 Kết luận: Chọn đúng ba phương án ✅ sẽ giúp mô hình spam classifier của bạn cân bằng giữa bias và variance, đạt performance tốt trên production theo tiêu chuẩn AWS ML (như trong Well-Architected Framework for ML). Nếu triển khai thực tế, kết hợp với Cross-Validation trong SageMaker!
Dataproc cluster, and depositing the results into Google BigQuery.
How should you securely run this workload?
- A Restrict the Google Cloud Storage bucket so only you can see the files
- B Grant the Project Owner role to a service account, and run the job with it
- C Use a service account with the ability to read the batch files and to write to BigQuery
- D Use a user account with the Project Viewer role on the Cloud Dataproc cluster to read the batch files and write to BigQuery
Xem giải thích
🧩 Phân tích chi tiết nội dung câu hỏi
Câu hỏi tập trung vào việc triển khai các thực hành bảo mật tốt nhất (security best practices) cho một data pipeline trên Google Cloud Platform (GCP). Cụ thể:
- Tình huống hiện tại: Bạn đang thực thi thủ công các job với vai trò Project Owner (quá quyền lực, không phù hợp cho automate).
- Yêu cầu automate:
- Lấy nightly batch files chứa non-public information (dữ liệu nhạy cảm, không công khai) từ Google Cloud Storage (GCS).
- Xử lý bằng Spark Scala job trên Google Cloud Dataproc cluster.
- Lưu kết quả vào Google BigQuery.
- Mục tiêu chính: Chạy workload một cách an toàn (securely), nghĩa là tuân thủ nguyên tắc least privilege (quyền hạn tối thiểu), tránh rủi ro bảo mật khi automate (không dùng tài khoản cá nhân hoặc quyền rộng).
Câu hỏi kiểm tra kiến thức về IAM (Identity and Access Management) trên GCP, đặc biệt là service accounts cho workload tự động, thay vì user accounts hoặc roles quá mạnh. (Kiến thức cập nhật đến 2026: GCP IAM hỗ trợ fine-grained permissions qua custom roles và workload identity federation, nhấn mạnh zero-trust security model).
📘 Tài liệu tham khảo:
- GCP IAM Best Practices (Google Cloud Docs, cập nhật 2025).
- Dataproc Security (nhấn mạnh service accounts cho jobs).
- BigQuery IAM Roles (roles như
bigquery.dataEditor).
✅ Đáp án đúng và lý do lựa chọn
Đáp án đúng: Use a service account with the ability to read the batch files and to write to BigQuery.
Lý do:
- 🛡️ Tuân thủ least privilege: Service account chỉ cần quyền cụ thể như
storage.objectViewer(đọc GCS bucket),dataproc.worker(chạy job trên Dataproc), vàbigquery.dataEditor(ghi BigQuery) – không cấp quyền toàn dự án. - 🤖 Phù hợp automate: Service accounts dành cho workload không tương tác người dùng, chạy nightly mà không cần login thủ công.
- 🔒 Bảo mật cao: Dữ liệu non-public được bảo vệ; Dataproc hỗ trợ impersonation qua service account key hoặc Workload Identity (khuyến nghị từ 2023+ để tránh key rotation).
- 🚀 Best practice GCP 2026: Sử dụng Organization Policies để enforce service accounts cho pipelines, tích hợp với VPC Service Controls.
📋 Giải thích tất cả các phương án (đúng/sai)
-
EASY [SAI] Restrict the Google Cloud Storage bucket so only you can see the files
❌ Sai vì: Chỉ giới hạn truy cập GCS bucket ở mức bucket-level (qua IAM policies nhưstorage.objectViewercho cá nhân), nhưng không giải quyết automate pipeline. Job Dataproc vẫn cần quyền đọc/ghi riêng (qua service account), không chỉ "restrict bucket". Không đề cập Dataproc/BigQuery access, dẫn đến failure khi chạy job. (Rủi ro: Dữ liệu nhạy cảm vẫn lộ nếu Project Owner chạy thủ công). -
SAI [SAI] Grant the Project Owner role to a service account, and run the job with it
❌ Sai vì: Project Owner là role rộng nhất (Owner IAM role:roles/owner), vi phạm least privilege – cấp quyền admin toàn dự án (tạo/delete resources, quản lý billing). GCP best practices cấm dùng Owner cho service accounts (từ 2022+ khuyến nghị custom roles). Rủi ro cao: Nếu SA bị compromise, toàn dự án bị ảnh hưởng. -
[ĐÚNG] Use a service account with the ability to read the batch files and to write to BigQuery
✅ Đúng vì: Như giải thích trên – fine-grained permissions (ví dụ:roles/storage.objectViewercho GCS read,roles/bigquery.dataEditorcho write,roles/dataproc.workercho cluster). Service account attach vào Dataproc job qua--service-accountflag. An toàn, scalable cho nightly runs. -
SAI [SAI] Use a user account with the Project Viewer role on the Cloud Dataproc cluster to read the batch files and write to BigQuery
❌ Sai vì: User account (tài khoản cá nhân) không phù hợp automate (cần MFA/login, không chạy headless). Project Viewer (roles/viewer) chỉ read-only, không cho write BigQuery hoặc full Dataproc execution. Phải dùng service account cho non-interactive workloads; user accounts dễ bị khóa/rotate.
SELECT country, state, city FROM [myproject:mydataset.mytable] GROUP BY country
You check the query plan for the query and see the following output in the Read section of Stage:1:
What is the most likely cause of the delay for this query?
- A Users are running too many concurrent queries in the system
- B The [myproject:mydataset.mytable] table has too many partitions
- C Either the state or the city columns in the [myproject:mydataset.mytable] table have too many NULL values
- D Most rows in the [myproject:mydataset.mytable] table have the same value in the country column, causing data skew
Xem giải thích
🧩 Giải thích chi tiết nội dung câu hỏi
Câu hỏi này xoay quanh vấn đề hiệu suất query chậm trên Google BigQuery – một data warehouse serverless của Google Cloud. Người dùng chạy query đơn giản sau đây luôn chậm, bất kể thời điểm nào:SELECT country, state, city FROM [myproject:mydataset.mytable] GROUP BY country
- Query này group dữ liệu theo cột
country, nhưng vẫn SELECT thêmstatevàcity(các cột không liên quan trực tiếp đến GROUP BY). - Query plan ở phần Read section của Stage:1 hiển thị một biểu đồ thanh (bar chart) với:
- Màu xanh dương (xanh lam): Một thanh nhỏ ở đầu, chiếm 0.01% dữ liệu (gần như không đáng kể).
- Màu tím (magenta): Phần còn lại dài chiếm 99.99% dữ liệu, cho thấy một slot (worker/slot) đọc gần như toàn bộ dữ liệu.
🖼️ Phân tích hình ảnh: Biểu đồ này minh họa data skew (sự lệch dữ liệu) nghiêm trọng trong quá trình đọc dữ liệu. BigQuery phân phối dữ liệu qua nhiều slot song song để xử lý GROUP BY, nhưng hầu hết dữ liệu tập trung vào một giá trịcountryduy nhất, khiến một slot phải đọc/ xử lý quá tải, trong khi các slot khác idle (nhàn rỗi). Điều này gây bottleneck, làm query chậm dù BigQuery tự động scale.
Vấn đề không phụ thuộc thời gian chạy (không phải do tải cao), mà do cấu trúc dữ liệu gây skew.
📘 Tài liệu tham khảo:
- BigQuery Query Execution Plans (cập nhật 2024-2026: Giải thích Stage:1 Read và data skew visualization).
- Troubleshoot BigQuery Performance (phần Data Skew và GROUP BY optimization).
✅ Đáp án đúng và lý do lựa chọn
Most rows in the [myproject:mydataset.mytable] table have the same value in the country column, causing data skew
🛠️ Lý do:
- Hình ảnh query plan rõ ràng thể hiện data skew: Một slot đọc 99.99% dữ liệu (màu tím), slot khác chỉ 0.01% (xanh dương).
- Với GROUP BY country, nếu hầu hết rows có cùng giá trị
country(ví dụ: "US" chiếm 99%), BigQuery không phân phối đều workload → Một worker overload, các worker khác chờ → Query chậm. - Đây là nguyên nhân cốt lõi và phổ biến nhất trong BigQuery (không phụ thuộc concurrent queries hay partitions).
- Giải pháp: Clustering table theo
country, dùng APPROX_COUNT_DISTINCT, hoặc materialize view.
❌ Giải thích tất cả các phương án (đúng/sai)
-
[SAI] Users are running too many concurrent queries in the system
🧩 Phân tích sai: Query chậm "no matter when they run" (bất kể lúc nào), không phải do tải concurrent. BigQuery on-demand slot tự scale, query plan chỉ show skew ở Stage:1 Read (không phải queue/wait). Concurrent cao sẽ hiện ở Slots hoặc Queue stage, không phải skew bar chart. -
[SAI] The [myproject:mydataset.mytable] table has too many partitions
🧩 Phân tích sai: Partitions giúp tối ưu query bằng partition pruning (chỉ đọc partitions cần). Query plan không đề cập partitions, và skew ở Read stage do GROUP BY key, không phải số lượng partitions. BigQuery giới hạn ~4k partitions/table (2026), nhưng thừa partitions gây chậm ở Scan chứ không skew như vậy. -
[SAI] Either the state or the city columns in the [myproject:mydataset.mytable] table have too many NULL values
🧩 Phân tích sai: NULL values không gây skew ở GROUP BYcountry. Query SELECTstate/citynhưng GROUP BY chỉ theocountry, NULL ở state/city chỉ tăng bytes scanned nhẹ (BigQuery compress NULL tốt). Skew rõ ràng từcountry(bar chart 99.99% một slot), không liên quan NULL. -
[ĐÚNG] Most rows in the [myproject:mydataset.mytable] table have the same value in the country column, causing data skew
✅ Đã giải thích chi tiết ở phần trên: Phù hợp hoàn hảo với query plan và biểu đồ skew.
🔍 Lời khuyên tối ưu: Sử dụng CLUSTER BY country khi tạo table (BigQuery 2026 hỗ trợ multi-level clustering), hoặc rewrite query thành SELECT country, ANY_VALUE(state), ANY_VALUE(city) để giảm scan. Test với EXPLAIN để verify!
- A Create a file on a shared file and have the application servers write all bid events to that file. Process the file with Apache Hadoop to identify which user bid first.
- B Have each application server write the bid events to Cloud Pub/Sub as they occur. Push the events from Cloud Pub/Sub to a custom endpoint that writes the bid event information into Cloud SQL.
- C Set up a MySQL database for each application server to write bid events into. Periodically query each of those distributed MySQL databases and update a master MySQL database with bid event information.
- D Have each application server write the bid events to Google Cloud Pub/Sub as they occur. Use a pull subscription to pull the bid events using Google Cloud Dataflow. Give the bid for each item to the user in the bid event that is processed first.
Xem giải thích
🧩 Phân tích chi tiết nội dung câu hỏi
Câu hỏi mô tả một ứng dụng đấu giá phân tán toàn cầu (globally distributed auction application), nơi người dùng đặt giá thầu (bid) trên các mặt hàng. Vấn đề chính là xung đột khi nhiều người dùng đặt bid giống hệt nhau gần như cùng lúc, và các máy chủ ứng dụng khác nhau (application servers) xử lý chúng. Mỗi sự kiện bid bao gồm: item (mặt hàng), amount (số tiền), user (người dùng), timestamp (thời gian).
Mục tiêu: Thu thập (collate) tất cả các sự kiện bid này vào một vị trí duy nhất theo thời gian thực (real-time) để xác định người dùng nào bid đầu tiên (which user bid first).
🔑 Yêu cầu cốt lõi:
- Xử lý real-time streaming data từ nhiều nguồn phân tán.
- Đảm bảo thứ tự xử lý chính xác dựa trên timestamp để tránh race condition (xung đột song song).
- Sử dụng dịch vụ Google Cloud phù hợp cho event-driven architecture với độ trễ thấp, khả năng scale toàn cầu (theo kiến thức cập nhật đến 2026, Google Cloud Pub/Sub và Dataflow hỗ trợ streaming với at-least-once delivery và exactly-once processing qua Apache Beam 2.52+).
📘 Tài liệu tham khảo:
- Google Cloud Pub/Sub Documentation (hỗ trợ global replication real-time).
- Cloud Dataflow Streaming Guide (exactly-once semantics từ 2023+).
✅ Đáp án đúng và lý do lựa chọn
Đáp án đúng: Have each application server write the bid events to Google Cloud Pub/Sub as they occur. Use a pull subscription to pull the bid events using Google Cloud Dataflow. Give the bid for each item to the user in the bid event that is processed first.
Lý do chọn đáp án này 🏆:
- Pub/Sub là dịch vụ messaging real-time, decoupled, scalable lý tưởng cho event streaming từ nhiều application servers phân tán toàn cầu. Nó hỗ trợ at-least-once delivery với ordering key (dựa trên item) để nhóm bid theo item.
- Pull subscription kết hợp Google Cloud Dataflow (dựa trên Apache Beam) cho phép streaming pipeline xử lý exactly-once (từ phiên bản Dataflow 2.50+ năm 2025), sắp xếp theo timestamp, và quyết định bid đầu tiên ngay lập tức mà không cần batching.
- Ưu điểm: Độ trễ thấp (<1s), auto-scale, fault-tolerant, phù hợp real-time collation. Không có race condition vì Dataflow windowing/grouping theo item/timestamp.
🛠️ Giải thích tất cả các phương án (đúng/sai)
Dưới đây là phân tích từng lựa chọn một cách chi tiết, giữ nguyên văn bản gốc tiếng Anh. Mỗi phương án được đánh giá dựa trên real-time, độ chính xác thứ tự, scalability, và rủi ro theo best practices Google Cloud (2026).
-
❌ [SAI] Create a file on a shared file and have the application servers write all bid events to that file. Process the file with Apache Hadoop to identify which user bid first.
Giải thích sai: Phương án này không real-time vì dùng shared file (dễ race condition khi write đồng thời, file lock overhead cao). Apache Hadoop là batch processing (MapReduce), mất hàng phút/giờ để xử lý, không phù hợp xác định "bid first" ngay lập tức. Scalability kém với global traffic, rủi ro data loss nếu file corrupt. -
❌ [SAI] Have each application server write the bid events to Cloud Pub/Sub as they occur. Push the events from Cloud Pub/Sub to a custom endpoint that writes the bid event information into Cloud SQL.
Giải thích sai: Pub/Sub tốt cho ingest, nhưng push subscription đến custom endpoint (self-managed) dễ overloaded, mất thứ tự (no built-in ordering), và Cloud SQL (OLTP relational DB) không optimize cho high-throughput streaming (write bottleneck >10k/sec). Không đảm bảo "first bid" real-time vì custom code phức tạp, rủi ro duplicate/out-of-order. -
❌ [SAI] Set up a MySQL database for each application server to write bid events into. Periodically query each of those distributed MySQL databases and update a master MySQL database with bid event information.
Giải thích sai: Distributed MySQL per server tạo sharding phức tạp, periodic query (không real-time, delay giây/phút). Master DB update dễ conflict/merge lỗi (timestamp collision), scalability kém (MySQL không native streaming). Rủi ro data inconsistency cao ở global scale. -
✅ [ĐÚNG] Have each application server write the bid events to Google Cloud Pub/Sub as they occur. Use a pull subscription to pull the bid events using Google Cloud Dataflow. Give the bid for each item to the user in the bid event that is processed first.
Giải thích đúng (tóm tắt lại): Như phần trên, Pub/Sub + pull + Dataflow là streaming pipeline chuẩn cho real-time collation, grouping by item, min-timestamp logic với exactly-once processing (Dataflow Runner v2). Hoàn hảo cho auction use-case! 🚀
Kết luận 💡: Phương án đúng tận dụng serverless streaming của Google Cloud, tránh tất cả pitfalls của batch/distributed DB. Nếu implement, dùng Dataflow template với Beam SQL cho windowed aggregation theo item.
- A Create a new view over events using standard SQL
- B Create a new partitioned table using a standard SQL query
- C Create a new view over events_partitioned using standard SQL
- D Create a service account for the ODBC connection to use for authentication
- E Create a Google Cloud Identity and Access Management (Cloud IAM) role for the ODBC connection and shared ג€eventsג€
Xem giải thích
🧩 Phân tích nội dung câu hỏi
Câu hỏi này thuộc chủ đề Google Cloud BigQuery, tập trung vào việc tối ưu hóa truy vấn và kết nối ứng dụng bên ngoài qua ODBC.
- Tổ chức đã thu thập và phân tích dữ liệu trong BigQuery suốt 6 tháng, chủ yếu lưu trữ trong bảng time-partitioned tên
events_partitioned(bảng phân vùng theo thời gian giúp tối ưu chi phí và hiệu suất). - Để giảm chi phí truy vấn, họ tạo một view tên
eventssử dụng legacy SQL, chỉ query dữ liệu 14 ngày gần nhất. - Tháng sau, các ứng dụng hiện tại sẽ kết nối BigQuery qua ODBC để đọc dữ liệu
events. - Vấn đề chính: Đảm bảo các ứng dụng có thể kết nối thành công. Cần chọn 2 hành động phù hợp.
Mục tiêu:
- ODBC driver cho BigQuery (phiên bản mới nhất đến 2026) chỉ hỗ trợ standard SQL, không hỗ trợ legacy SQL views. View
eventshiện tại sẽ gây lỗi khi app đọc. - Ngoài ra, cần cơ chế xác thực (authentication) an toàn cho kết nối ODBC từ ứng dụng bên ngoài.
📘 Tài liệu tham khảo:
- BigQuery ODBC Driver Documentation (Google Cloud, cập nhật 2024-2026) – Xác nhận yêu cầu standard SQL và service account auth.
- BigQuery SQL Dialects (Legacy vs Standard) – Legacy SQL deprecated cho các client mới như ODBC.
✅ Đáp án đúng (Chọn 2)
- Create a new view over events_partitioned using standard SQL
- Create a service account for the ODBC connection to use for authentication
Lý do chọn:
- Tạo view mới bằng standard SQL trực tiếp trên bảng gốc
events_partitionedđể query 14 ngày gần nhất, thay thế view legacy SQL cũ. Điều này đảm bảo ODBC driver đọc được dữ liệu mà không lỗi. - Tạo service account cung cấp key JSON cho ODBC auth, an toàn và scalable cho app kết nối (không dùng user account cá nhân). Đây là best practice cho external connections đến 2026.
🛠️ Giải thích chi tiết tất cả các phương án
-
Create a new view over events using standard SQL ❌
Sai: Vieweventsgốc dùng legacy SQL. Tạo view standard SQL trên view legacy sẽ gây lỗi syntax hoặc incompatibility (legacy SQL không tương thích hoàn toàn với standard SQL nesting). Không giải quyết gốc rễ vấn đề ODBC. -
Create a new partitioned table using a standard SQL query ❌
Sai: Không cần tạo bảng mới vì bảngevents_partitionedđã partitioned sẵn. Việc copy data vào bảng mới tốn kém (storage + compute), không giảm chi phí query như view. View là giải pháp tối ưu hơn. -
Create a new view over events_partitioned using standard SQL ✅
Đúng: Trực tiếp query standard SQL trên bảng partitioned gốc (ví dụ:WHERE _PARTITIONTIME >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 14 DAY)). ODBC hỗ trợ đầy đủ, giữ nguyên logic 14 ngày, giảm chi phí scan partition cũ. Đây là migration chuẩn từ legacy sang standard SQL. -
Create a service account for the ODBC connection to use for authentication ✅
Đúng: ODBC yêu cầu service account key (JSON) cho OAuth2 auth. Gán IAM roles nhưBigQuery Data Viewercho service account, cho phép app đọc view/bảng mà không cần user login. An toàn, không expose credentials. -
Create a Google Cloud Identity and Access Management (Cloud IAM) role for the ODBC connection and shared ג€eventsג€ ❌
Sai: Tạo IAM role thôi chưa đủ (cần bind với principal như service account). "Shared ג€eventsג€" có vẻ lỗi đánh máy (có lẽ "shared 'events'"), nhưng chia sẻ view không thay thế auth mechanism. ODBC không dùng direct IAM role sharing mà cần service account key. Không phải giải pháp chuẩn.
Kết luận 🎯: Hai hành động đúng giúp app ODBC connect mượt mà, tuân thủ best practices BigQuery 2026 (standard SQL mandatory cho clients mới). Nếu implement, test với ODBC driver v2.5+!
- A Use the TABLE_DATE_RANGE function
- B Use the WHERE_PARTITIONTIME pseudo column
- C Use WHERE date BETWEEN YYYY-MM-DD AND YYYY-MM-DD
- D Use SELECT IF.(date >= YYYY-MM-DD AND date <= YYYY-MM-DD
Xem giải thích
🧩 Phân tích chi tiết nội dung câu hỏi
Câu hỏi tập trung vào tình huống bạn đã kích hoạt tích hợp miễn phí giữa Firebase Analytics và Google BigQuery. Khi đó, Firebase sẽ tự động tạo một bảng mới hàng ngày trong BigQuery với định dạng tên bảng là app_events_YYYYMMDD (ví dụ: app_events_20231201).
📊 Yêu cầu cụ thể: Bạn muốn truy vấn (query) tất cả các bảng này cho 30 ngày qua bằng legacy SQL (phiên bản SQL cũ của BigQuery, không phải standard SQL).
🛠️ Thách thức chính: Vì mỗi ngày là một bảng riêng biệt (wildcard tables theo ngày), bạn cần một hàm đặc biệt để "gom" tất cả các bảng liên quan vào một truy vấn duy nhất mà không phải liệt kê thủ công từng bảng. Điều này rất phổ biến trong dữ liệu streaming từ Firebase để phân tích sự kiện ứng dụng theo thời gian.
✅ Đáp án đúng và lý do lựa chọn
Đáp án đúng: Use the TABLE_DATE_RANGE function
Lý do chi tiết:
- Trong legacy SQL của BigQuery (cập nhật đến 2026, vẫn hỗ trợ cho các truy vấn cũ), hàm
TABLE_DATE_RANGE(table_prefix, start_date, end_date)chính là công cụ lý tưởng để truy vấn nhiều bảng theo định dạng ngày tháng_YYYYMMDD. - Cách dùng:
TABLE_DATE_RANGE(['my_dataset.app_events_'], '20240101', '20240130')sẽ tự động mở rộng thành tất cả bảngapp_events_YYYYMMDDtrong khoảng 30 ngày. - Đây là phương pháp chuẩn và hiệu quả nhất cho dữ liệu Firebase Analytics, tránh phải viết UNION thủ công cho hàng tá bảng.
- ✅ Lợi ích: Tự động, scalable, phù hợp với dữ liệu hàng ngày từ Firebase (theo tài liệu chính thức Google Cloud).
📋 Giải thích tất cả các phương án (đúng/sai)
-
✅ Use the TABLE_DATE_RANGE function
Đúng vì: Như đã giải thích ở trên, hàm này được thiết kế chuyên biệt cho các bảng wildcard theo ngày (_YYYYMMDD) trong legacy SQL. Nó tạo ra một bảng ảo từ nhiều bảng thực tế, cho phép query liền mạch 30 ngày qua mà không cần partition hoặc filter thủ công. Hoàn hảo cho Firebase export! 🏆 -
❌ Use the WHERE_PARTITIONTIME pseudo column
Sai vì:WHERE_PARTITIONTIMElà pseudo column dùng cho partitioned tables trong standard SQL (không phải legacy SQL). Các bảng Firebaseapp_events_YYYYMMDDkhông phải partitioned table mà là ngày-based wildcard tables riêng biệt. Dùng cái này sẽ báo lỗi hoặc không query được dữ liệu từ nhiều bảng. -
❌ Use WHERE date BETWEEN YYYY-MM-DD AND YYYY-MM-DD
Sai vì: Cú phápWHERE date BETWEENchỉ filter dữ liệu bên trong một bảng duy nhất, không thể tự động query nhiều bảng khác nhau (như 30 bảng riêng). Bạn phải UNION thủ công tất cả, rất bất tiện và không scalable cho 30 ngày. Legacy SQL không hỗ trợ wildcard như vậy mà không có hàm đặc biệt. -
❌ Use SELECT IF.(date >= YYYY-MM-DD AND date <= YYYY-MM-DD
Sai vì: Cú phápSELECT IF(date >= ...)là hàm điều kiện logic (IF), không dùng để query nhiều bảng. Nó chỉ filter dữ liệu trong một bảng, và cú pháp bị lỗi (thiếu dấu ngoặc, dấu chấm lạ). Không giải quyết được vấn đề gom 30 bảngapp_events_YYYYMMDDvào một truy vấn.
📘 Tài liệu tham khảo (cập nhật mới nhất đến 2026)
- BigQuery Legacy SQL Functions: TABLE_DATE_RANGE – Tài liệu chính thức Google Cloud.
- Firebase Analytics to BigQuery Export – Hướng dẫn tích hợp và query dữ liệu hàng ngày.
- BigQuery Wildcard Tables – Giải thích chi tiết legacy SQL cho bảng theo ngày.
Hy vọng phân tích này giúp bạn nắm vững kiến thức! 🚀 Nếu cần ví dụ query cụ thể, hãy hỏi thêm nhé!
- A They have not assigned the timestamp, which causes the job to fail
- B They have not set the triggers to accommodate the data coming in late, which causes the job to fail
- C They have not applied a global windowing function, which causes the job to fail when the pipeline is created
- D They have not applied a non-global windowing function, which causes the job to fail when the pipeline is created
Xem giải thích
🧩 Phân tích nội dung câu hỏi
Câu hỏi mô tả tình huống công ty đang thiết lập data pipelines cho chiến dịch quảng cáo, sử dụng Google Cloud Pub/Sub để xử lý dữ liệu streaming. Yêu cầu kinh doanh quan trọng là xác định định kỳ các inputs (dữ liệu đầu vào) và thời gian của chúng trong chiến dịch. Các kỹ sư quyết định sử dụng windowing (phân vùng thời gian) và transformation trong Google Cloud Dataflow để thực hiện. Tuy nhiên, khi test, Dataflow job thất bại hoàn toàn với tất cả streaming inserts (dữ liệu streaming được chèn).
Vấn đề cốt lõi: Job fail ngay khi tạo pipeline cho streaming data từ Pub/Sub, liên quan đến cách áp dụng windowing. Trong Dataflow (dựa trên Apache Beam), streaming pipelines bắt buộc phải sử dụng non-global windowing (như FixedWindow, SlidingWindow, SessionWindow) để xử lý dữ liệu theo thời gian thực. Nếu dùng global window hoặc không chỉ định window phù hợp, pipeline sẽ fail ngay từ đầu.
✅ Đáp án đúng và lý do lựa chọn
Đáp án đúng: They have not applied a non-global windowing function, which causes the job to fail when the pipeline is created
Lý do:
Trong streaming pipelines của Dataflow, non-global windowing (ví dụ: FixedWindow, SlidingWindow) là bắt buộc để nhóm dữ liệu theo thời gian và xử lý late data. Nếu không áp dụng non-global window (tức là dùng global window hoặc không window gì), job sẽ thất bại ngay khi tạo pipeline vì Dataflow không hỗ trợ global windowing cho streaming (chỉ dành cho batch mode). Điều này khớp với triệu chứng "fails for all streaming insert" và "when the pipeline is created". Kiến thức cập nhật đến 2026: Dataflow v2.58+ vẫn yêu cầu strict này để đảm bảo tính unbounded data handling.
📘 Tài liệu tham khảo:
- Apache Beam Programming Guide - Windowing (Global windows chỉ cho bounded datasets/batch).
- Google Cloud Dataflow Docs: Streaming Windowing (Non-global windows required for streaming).
🛠️ Giải thích chi tiết tất cả các phương án
Dưới đây là phân tích từng lựa chọn, giữ nguyên nội dung gốc bằng tiếng Anh. Mỗi phương án được đánh giá đúng/sai kèm lý do cụ thể bằng tiếng Việt:
-
❌ They have not assigned the timestamp, which causes the job to fail
Sai: Pub/Sub tự động assign timestamp (publish time) cho mỗi message, và Dataflow sử dụng nó mặc định cho windowing. Không assign explicit timestamp chỉ gây lệch window chứ không làm job fail hoàn toàn. Nếu thiếu, Dataflow dùng ingestion time thay thế mà không crash pipeline. -
❌ They have not set the triggers to accommodate the data coming in late, which causes the job to fail
Sai: Triggers (early, on-time, late) giúp xử lý late data sau window đóng, nhưng không bắt buộc và thiếu triggers chỉ làm mất data muộn chứ không fail job ngay khi tạo. Mặc định Dataflow dùng default triggers; vấn đề này chỉ ảnh hưởng runtime, không phải creation. -
❌ They have not applied a global windowing function, which causes the job to fail when the pipeline is created
Sai: Ngược lại, global window chỉ dùng cho batch pipelines (bounded data). Nếu KHÔNG dùng global window trong streaming thì pipeline vẫn chạy (với non-global hoặc mặc định). Fail chỉ xảy ra nếu BUỘC dùng global window trong streaming, nhưng option này nói "not applied" nên không phải nguyên nhân. -
✅ They have not applied a non-global windowing function, which causes the job to fail when the pipeline is created
Đúng: Như giải thích ở trên, streaming yêu cầu non-global window để xử lý unbounded data theo thời gian. Thiếu nó (dùng global hoặc không window) dẫn đến lỗi validation ngay creation phase, khớp triệu chứng "fails for all streaming insert".
🧩 Mẹo khắc phục: Sử dụng.window(FixedWindows.of(Duration.standardMinutes(5)))trong Beam pipeline code.
- A Modify the transformMapReduce jobs to apply sensor calibration before they do anything else.
- B Introduce a new MapReduce job to apply sensor calibration to raw data, and ensure all other MapReduce jobs are chained after this.
- C Add sensor calibration data to the output of the ETL process, and document that all users need to apply sensor calibration themselves.
- D Develop an algorithm through simulation to predict variance of data output from the last MapReduce job based on calibration factors, and apply the correction to all data.
Xem giải thích
🧩 Phân tích chi tiết nội dung câu hỏi
Câu hỏi mô tả một hệ thống kiến trúc để phân tích dữ liệu địa chấn (seismic data), sử dụng quy trình ETL (Extract, Transform, Load) chạy dưới dạng chuỗi các job MapReduce trên cụm Apache Hadoop. Quy trình này mất nhiều ngày để xử lý một bộ dữ liệu do một số bước tính toán tốn kém về tài nguyên. Sau đó, phát hiện ra bước calibrate sensor (hiệu chỉnh cảm biến) đã bị bỏ sót.
Vấn đề cốt lõi: Làm thế nào để thay đổi quy trình ETL nhằm đảm bảo sensor calibration được thực hiện một cách có hệ thống (systematically) trong tương lai, mà không làm gián đoạn hoặc phức tạp hóa quy trình hiện tại.
🛠️ Bối cảnh AWS: Đây là tình huống điển hình trên Amazon EMR (Elastic MapReduce), nơi các MapReduce jobs được chain (liên kết) thành steps trong workflow ETL. Việc calibrate sensor nên áp dụng sớm trên raw data để tránh tái xử lý toàn bộ dữ liệu tốn kém.
✅ Đáp án đúng và lý do lựa chọn
Đáp án đúng: Introduce a new MapReduce job to apply sensor calibration to raw data, and ensure all other MapReduce jobs are chained after this.
Lý do:
- Phương án này thêm một job MapReduce mới chuyên biệt để calibrate raw data (dữ liệu thô) ngay từ đầu pipeline, sau đó chain (liên kết) tất cả các job còn lại phía sau.
- ✅ Ưu điểm: Đảm bảo calibration được thực hiện systematically (tự động, nhất quán) mà không sửa đổi các job hiện có, tránh rủi ro lỗi trong các bước transform phức tạp. Trên AWS EMR, chaining steps qua EMR Steps API hoặc AWS Step Functions rất hiệu quả, giảm thời gian tái xử lý và dễ scale.
- Đây là best practice theo Hadoop MapReduce và AWS EMR (cập nhật đến 2026, EMR version 6.x+ hỗ trợ Hadoop 3.x với job chaining mượt mà hơn).
📋 Giải thích tất cả các phương án
Dưới đây là phân tích từng phương án (giữ nguyên văn bản gốc tiếng Anh). Mỗi phương án được đánh giá đúng/sai với lý do chi tiết:
-
❌ [SAI] Modify the transformMapReduce jobs to apply sensor calibration before they do anything else.
Phương án này yêu cầu sửa đổi các job transform MapReduce hiện có để thêm calibration ở đầu mỗi job. Lý do sai: Các job transform thường phức tạp và computationally expensive; việc chỉnh sửa có thể gây lỗi, tăng thời gian debug, và không systematic vì phải thay đổi nhiều job. Không khuyến khích trong AWS EMR vì vi phạm nguyên tắc modularity (tách biệt job), dẫn đến rủi ro cao khi scale. -
✅ [ĐÚNG] Introduce a new MapReduce job to apply sensor calibration to raw data, and ensure all other MapReduce jobs are chained after this.
Như đã giải thích ở phần đáp án đúng: Thêm job mới ở đầu pipeline trên raw data, chain các job sau qua EMR Steps. Lý do đúng: Systematic, reusable, không ảnh hưởng code cũ, phù hợp với data pipeline best practices trên Hadoop/EMR. -
❌ [SAI] Add sensor calibration data to the output of the ETL process, and document that all users need to apply sensor calibration themselves.
Phương án này thêm dữ liệu calibration vào output cuối ETL và yêu cầu user tự apply. Lý do sai: Không systematic vì đẩy trách nhiệm cho user, dễ lỗi con người, và vi phạm nguyên tắc ETL (dữ liệu output phải clean). Trên AWS, điều này chống lại data quality gates trong EMR/S3 workflows. -
❌ [SAI] Develop an algorithm through simulation to predict variance of data output from the last MapReduce job based on calibration factors, and apply the correction to all data.
Phương án này phát triển algorithm mô phỏng để dự đoán variance ở output cuối và correct sau. Lý do sai: Phức tạp, không chính xác (simulation không thay thế calibration thực tế trên raw data), tốn kém compute, và không systematic cho future vì phải tái mô phỏng mỗi lần. AWS khuyến nghị upstream correction thay vì downstream hack.
📘 Tài liệu tham khảo
- AWS EMR Documentation (cập nhật 2026): Launch EMR Cluster with Steps & Chaining MapReduce Steps – Hướng dẫn chain jobs cho ETL scalable.
- Apache Hadoop MapReduce Guide: Job Chaining – Best practice thêm preprocessing job.
- AWS Big Data Blog: "Building ETL Pipelines with EMR" (2025 update) – Nhấn mạnh modularity cho sensor data processing.
- Nguồn câu hỏi gốc: AWS Certified Big Data - Specialty (SOA-C02) exam sample, tương tự EMR scenarios.
Hy vọng phân tích này giúp bạn ôn thi hiệu quả! 🚀 Nếu cần thêm ví dụ code EMR, hãy hỏi nhé!
- A BigQuery
- B Cloud SQL
- C Cloud BigTable
- D Cloud Datastore
Xem giải thích
🧩 Phân tích nội dung câu hỏi
Câu hỏi mô tả một nhà bán lẻ trực tuyến đang chạy ứng dụng trên Google App Engine (một nền tảng PaaS dễ mở rộng). Họ cần mở rộng ứng dụng để khách hàng có thể thực hiện giao dịch mua sắm trực tiếp (shopping transactions), đồng thời quản lý các giao dịch này và phân tích dữ liệu kết hợp từ nhiều bộ dữ liệu khác nhau bằng công cụ Business Intelligence (BI tool) như Looker Studio hoặc Tableau. Yêu cầu quan trọng: Sử dụng chỉ một database duy nhất để đáp ứng cả hai nhu cầu (giao dịch và phân tích).
Điều này đòi hỏi database phải hỗ trợ:
- Giao dịch ACID-compliant (OLTP - Online Transaction Processing) cho mua sắm an toàn, tránh mất dữ liệu.
- Truy vấn phức tạp (JOINs, aggregations) trên dữ liệu từ nhiều nguồn để phục vụ BI.
- Tích hợp tốt với App Engine và BI tools. Dựa trên kiến thức Google Cloud cập nhật đến năm 2026 (phiên bản Cloud SQL Enterprise Plus mới nhất hỗ trợ AI integrations và high availability), chúng ta cần chọn database relational hỗ trợ cả OLTP và OLAP cơ bản trong một hệ thống duy nhất. 📘 Tài liệu tham khảo: Google Cloud SQL Overview và App Engine Integrations.
✅ Đáp án đúng: Cloud SQL
Lý do lựa chọn:
- Cloud SQL là managed relational database (hỗ trợ MySQL, PostgreSQL, SQL Server) với đầy đủ hỗ trợ giao dịch ACID 🛡️️, phù hợp quản lý shopping transactions (insert/update/delete an toàn, tránh double-spending).
- Hỗ trợ SQL chuẩn cho phân tích dữ liệu kết hợp từ multiple datasets (JOINs, subqueries), dễ kết nối BI tools qua JDBC/ODBC.
- Single database: Không cần tách OLTP/OLAP, tiết kiệm chi phí và đơn giản hóa kiến trúc (tích hợp native với App Engine qua Cloud SQL Proxy).
- Cập nhật 2026: Hỗ trợ vector search và read replicas cho BI queries nhanh hơn. Đây là lựa chọn tối ưu cho workload hybrid transaction + analytics trong một DB. 🏆
📋 Giải thích chi tiết tất cả các phương án
Dưới đây là phân tích từng lựa chọn, giữ nguyên văn bản gốc bằng tiếng Anh. Mỗi phương án được đánh giá đúng/sai với lý do cụ thể dựa trên yêu cầu "single database" cho cả transactions và BI analysis:
-
BigQuery ❌ SAI
BigQuery là serverless data warehouse chuyên OLAP (analytics lớn), xuất sắc cho BI queries trên petabyte-scale data với JOINs nhanh. Tuy nhiên, không hỗ trợ giao dịch ACID (read-only append-only model), không phù hợp manage shopping transactions (không update/delete realtime). Không thể dùng single DB cho OLTP. 🧠 Phù hợp export data từ app để analyze, không phải primary store. -
Cloud SQL ✅ ĐÚNG
Như đã giải thích ở trên: Relational DB managed, ACID transactions đầy đủ + SQL queries phức tạp cho BI trên multiple datasets. Tích hợp seamless với App Engine và BI tools (ví dụ: direct connector cho Looker). Single DB lý tưởng cho hybrid workload. 🚀 Cập nhật 2026: Boost performance với InnoDB Cluster cho HA. -
Cloud BigTable ❌ SAI
Cloud Bigtable là NoSQL wide-column store cho high-throughput OLTP (millions QPS), tốt cho time-series hoặc IoT, nhưng thiếu SQL chuẩn (chỉ hỗ trợ HBase API hoặc BigQuery integration gián tiếp). Không hỗ trợ JOINs dễ dàng cho BI trên multiple datasets, và không ACID full cho complex transactions. Không phù hợp single DB cho relational analysis. ⚡ Dùng cho Cassandra-like workloads, không phải shopping cart. -
Cloud Datastore ❌ SAI
Cloud Datastore (nay tích hợp Firestore) là NoSQL document database native cho App Engine, scalable tự động, hỗ trợ transactions đơn giản (nhưng giới hạn 25 entity/group). Yếu về JOINs (kind-based queries, không relational), khó analyze combined data từ multiple datasets cho BI (phải denormalize hoặc dùng BigQuery export). Không phải single DB lý tưởng cho SQL-based BI. 🌐 Tốt cho web apps đơn giản, nhưng thiếu relational power.
🛠️ Khuyến nghị triển khai
- Migrate từ App Engine bằng Cloud SQL Proxy cho kết nối secure.
- Scale BI với read replicas trong Cloud SQL.
- Nếu data lớn sau này, hybrid: Cloud SQL (transactions) + BigQuery (analytics via federated queries).
📘 Nguồn bổ sung: Google Cloud Database Comparison (cập nhật 2026). Hy vọng phân tích này giúp bạn ôn thi hiệu quả! 🎯
- A Convert all daily log tables into date-partitioned tables
- B Convert the sharded tables into a single partitioned table
- C Enable query caching so you can cache data from previous months
- D Create separate views to cover each month, and query from these views
Xem giải thích
🧩 Phân tích chi tiết nội dung câu hỏi
Câu hỏi mô tả một ứng dụng game đã ra mắt gần 3 năm, với các file log hàng ngày được upload vào các bảng BigQuery riêng biệt theo định dạng tên bảng LOGS_yyyymmdd (ví dụ: LOGS_20230101). Người dùng đã sử dụng table wildcard functions (như LOGS_*) để tạo báo cáo hàng ngày và hàng tháng cho mọi khoảng thời gian. 📈 Tuy nhiên, gần đây, các truy vấn (query) bao quát khoảng thời gian dài (nhiều năm) vượt quá giới hạn 1.000 bảng (tables) mà BigQuery cho phép trong một query wildcard, dẫn đến thất bại. 🎮
Vấn đề cốt lõi: BigQuery giới hạn wildcard table queries chỉ scan tối đa 1.000 bảng để tránh hiệu suất kém và chi phí cao. Với 3 năm dữ liệu (~1.000 ngày), query dễ vượt limit này. 🛑 Cần giải pháp tái cấu trúc dữ liệu để query hiệu quả hơn mà không dùng wildcard nhiều bảng.
✅ Đáp án đúng và lý do lựa chọn
Đáp án đúng: Convert the sharded tables into a single partitioned table
🧠 Lý do: Các bảng LOGS_yyyymmdd là sharded tables (bảng phân mảnh theo ngày). Giải pháp tối ưu là chuyển tất cả vào một bảng duy nhất (single table) được partition theo ngày (date-partitioned hoặc ingestion-time partitioned). Điều này cho phép query với _PARTITIONTIME hoặc DATE(_PARTITIONTIME) mà không cần wildcard, tránh hoàn toàn limit 1.000 bảng. Query sẽ nhanh hơn, rẻ hơn nhờ partition pruning (chỉ scan partitions cần thiết). 📊 Đây là best practice của BigQuery cho dữ liệu thời gian theo phiên bản mới nhất (2024-2026).
Dẫn nguồn:
- BigQuery Partitioned Tables
- Querying Wildcard Tables Limitations (xác nhận limit 1.000 tables).
- Best Practices for Time-Series Data.
🔍 Giải thích tất cả các phương án (đúng/sai)
-
[SAI] Convert all daily log tables into date-partitioned tables
❌ Sai vì: Việc chuyển từng bảng hàng ngày thành date-partitioned tables vẫn giữ nguyên nhiều bảng riêng lẻ (hàng nghìn bảng). Wildcard query vẫn phải scan qua tất cả, dễ vượt limit 1.000 tables. Không giải quyết gốc rễ, chỉ làm phức tạp thêm mà không cải thiện hiệu suất toàn cục. 🧱 -
[ĐÚNG] Convert the sharded tables into a single partitioned table
✅ Đúng vì: Như đã giải thích ở trên, hợp nhất tất cả sharded tables vào một bảng partitioned duy nhất (sử dụngCREATE TABLE ... PARTITION BY DATE(timestamp_column)hoặc ingestion-time). Query dùngWHERE _PARTITIONTIME BETWEEN ...để prune partitions, hỗ trợ query dài hạn mà không giới hạn tables. Hiệu suất cao, chi phí thấp – khuyến nghị chính thức từ Google Cloud. 🚀 -
[SAI] Enable query caching so you can cache data from previous months
❌ Sai vì: Query caching chỉ lưu kết quả query cũ để tái sử dụng nhanh nếu dữ liệu/input giống hệt, không giải quyết limit 1.000 tables. Query dài vẫn fail ngay từ đầu do wildcard scan quá nhiều bảng, cache không áp dụng được. Đây chỉ là tối ưu tạm thời, không phải giải pháp cấu trúc. ⏳ -
[SAI] Create separate views to cover each month, and query from these views
❌ Sai vì: Tạo views theo tháng vẫn dựa trên wildcard tables gốc, query views nhiều tháng vẫn có thể vượt limit 1.000 tables ngầm (views kế thừa wildcard). Với 3 năm (~36 tháng), query tổng hợp views dễ fail và kém hiệu suất. Views chỉ là lớp trừu tượng, không thay đổi dữ liệu gốc. 👻
🛠️ Khuyến nghị bổ sung
- Cách thực hiện đáp án đúng: Sử dụng
INSERT INTO new_partitioned_table SELECT * FROM LOGS_*với script ETL (Dataflow hoặc script) để migrate dần. Sau đó, set lifetime cho partitions cũ để quản lý chi phí. 🔄 - Lợi ích dài hạn: Giảm scanned data lên đến 99%, hỗ trợ clustering cho query nhanh hơn (phiên bản BigQuery 2026).
📘 Tài liệu tham khảo thêm: Migrating Sharded Tables to Partitioned.