Ngân hàng đề — Google Cloud Associate Data Practitioner

Tìm thấy 333 câu.

Câu 241 Data Analysis and Presentation

A team is using Vertex AI AutoML to train a classification model on tabular data. One of the columns in their dataset is a zip_code string. They believe this feature is important but want to ensure the model treats it as a distinct category rather than a numerical or text value.

How should they handle this during the training process in the AutoML UI?

  1. A Explicitly set the column's transformation type to "Categorical."
  2. B Let AutoML automatically infer the data type.
  3. C Use a text-based transformation for the column.
  4. D Manually convert the zip codes to integers in the source file.
Xem giải thích

Đáp án

A — Đặt tường minh kiểu biến đổi của cột thành "Categorical".

Vì sao đúng

Mã bưu chính (zip code) trông như số nhưng không phải số: 90210 không "lớn hơn" 10001 theo nghĩa nào cả. Nếu để mô hình coi nó là số, mọi phép so sánh và khoảng cách đều vô nghĩa.

⚠ Vấn đề khi coi zip code là số:

Mô hình học được:
    "zip > 50000 thì khả năng mua cao hơn"
        ↓
    ⚠ Hoàn toàn VÔ NGHĨA
    → mã bưu chính là NHÃN,
      chỉ tình cờ viết bằng chữ số
        ↓
    Khoảng cách 90210 − 90211 = 1
    Khoảng cách 90210 − 10001 = 80209
        ↓
    ⚠ Nhưng hai vùng "cách nhau 1"
      chưa chắc giống nhau chút nào

⚠ Khi đặt Categorical thì AutoML làm gì:

Mỗi mã bưu chính = một HẠNG MỤC riêng
        ↓
    Mã hoá one-hot hoặc embedding
        ↓
    ⚠ Không có thứ tự
    ⚠ Không có khoảng cách số học
    ⚠ Mô hình học ĐỘC LẬP cho từng vùng

⚠ Vì sao đừng phó mặc cho suy luận tự động:

AutoML thấy cột toàn chữ số
        ↓
    ⚠ RẤT DỄ đoán là NUMERIC
        ↓
    Và nó KHÔNG BÁO LỖI —
    mô hình vẫn huấn luyện xong,
    chỉ là học sai quan hệ
        ↓
    → Đây là kiểu lỗi IM LẶNG
      nguy hiểm nhất trong ML
        ↓
    Đặt tường minh = kiểm soát được

⚠ Vì sao KHÔNG đổi zip code thành số nguyên:

"90210" → 90210
        ↓
    ⚠ Làm CHÍNH XÁC điều ta muốn tránh
    ⚠ Còn mất luôn số 0 đứng đầu:
      "01234" → 1234
        ↓
    → hai vùng khác nhau bị trộn làm một

Vì sao các phương án khác sai

  • B (để AutoML tự suy luận) — phương án gần nhất và là bẫy chính: suy luận tự động thường đúng, nhưng với cột toàn chữ số nó rất dễ đoán thành numeric. Đề nói rõ nhóm muốn CHẮC CHẮN — vậy thì phải khai tường minh.

  • C (dùng biến đổi kiểu text) — kiểu text dành cho văn bản tự do, nó sẽ tách từ, dựng embedding ngôn ngữ. Với một mã ngắn cố định thì đó là lãng phí và nhiễu, dù vẫn hơn numeric.

  • D (chuyển zip code thành số nguyên trong file nguồn) — làm nặng thêm chính vấn đề, và mất số 0 đứng đầu.

Ghi nhớ

⚠ Các kiểu biến đổi cột trong AutoML Tabular — bảng phải thuộc: | Kiểu | Dùng cho | |---|---| | Numeric | giá trị có thứ tự và khoảng cách thật — tuổi, giá, số lượng | | Categorical | nhãn rời rạc — mã bưu chính, mã tỉnh, ID sản phẩm, loại | | Text | văn bản tự do — mô tả, nhận xét | | Timestamp | ngày giờ — AutoML tự tách năm/tháng/thứ | | Array | danh sách giá trị |

Từ khoá nhận diện:

"trông như số nhưng là mã" → Categorical "cộng trừ nó có ý nghĩa không?" → nếu KHÔNG thì Categorical "câu văn tự do" → Text "ngày tháng" → Timestamp, đừng để dạng chuỗi

Những cột hay bị gán nhầm thành Numeric Cột
Mã bưu chính
ID khách hàng, ID sản phẩm ⚠ và thường nên BỎ HẲN, không dùng làm đặc trưng
Mã tỉnh / mã vùng
Số điện thoại
Năm sản xuất tuỳ bài — đôi khi numeric lại hợp
Câu hỏi tự vấn "trung bình của cột này có ý nghĩa không?"
ID có nên làm đặc trưng không Trả lời
Thường là KHÔNG mô hình sẽ học thuộc lòng từng ID
Hậu quả overfitting nặng, không tổng quát hoá
Ngoại lệ ID có ý nghĩa nhóm (ví dụ mã danh mục)
Thực hành loại ID khỏi tập đặc trưng
Đặc trưng categorical có quá nhiều giá trị (high cardinality) Cách xử lý
Gộp nhóm mã bưu chính → tỉnh/thành
Giữ N giá trị phổ biến nhất, còn lại thành KHÁC
Dùng embedding thay one-hot AutoML tự làm
⚠ hàng chục nghìn hạng mục làm mô hình phình và chậm
Kiểm tra dữ liệu trước khi huấn luyện Việc
Xem trang thống kê từng cột trong AutoML phân phối, số giá trị thiếu
Kiểm kiểu biến đổi của TỪNG cột đừng lướt qua
Tìm rò rỉ nhãn ⚠ cột nào biết trước kết quả thì phải bỏ
Xem tỉ lệ nhãn lệch quá thì cân nhắc lấy mẫu lại

Ba việc kiểm chứng: | Việc | Cách | |---|---| | Kiểu cột đã đúng chưa | trang cấu hình huấn luyện — soát từng dòng | | Cột nào ảnh hưởng nhiều | feature importance sau khi huấn luyện | | Mô hình có bị rò rỉ nhãn không | độ chính xác đẹp bất thường (>99%) là dấu hiệu đáng ngờ |

Và một câu hỏi đơn giản nên tự đặt cho mọi cột số trước khi huấn luyện: "lấy trung bình cột này có nghĩa gì không?" Trung bình của tuổi có nghĩa, trung bình của giá có nghĩa — nhưng trung bình của mã bưu chính thì không, và đó là dấu hiệu chắc chắn rằng cột ấy phải là hạng mục.

Câu 242 Data Preparation and Ingestion

A large retail company captures sales transaction data in an on-premises data center and wants to move it to BigQuery for analysis. The business requires that the data be transformed and cleaned before it is loaded into the final analytics tables to ensure data quality and enforce business rules.

Which data manipulation methodology does this process describe?

  1. A Data Replication
  2. B ELT (Extract, Load, Transform)
  3. C ETL (Extract, Transform, Load)
  4. D ETLT (Extract, Transform, Load, Transform)
Xem giải thích

Đáp án

C — ETL (Extract, Transform, Load).

Vì sao đúng

Đề nói rõ một mệnh đề quyết định: dữ liệu phải được biến đổi và làm sạch TRƯỚC KHI nạp vào bảng phân tích cuối cùng. Đó chính là định nghĩa của ETL — chữ T đứng TRƯỚC chữ L.

⚠ Đọc thứ tự chữ cái là ra đáp án:

E  Extract   — rút từ trung tâm dữ liệu tại chỗ
T  Transform — ⚠ LÀM SẠCH, ÁP LUẬT NGHIỆP VỤ
L  Load      — nạp vào BigQuery
        ↓
    ⚠ Chỉ dữ liệu ĐÃ SẠCH mới vào kho

⚠ So với ELT — khác nhau ở chỗ nào:

ETL                        ELT
  Rút                        Rút
   ↓                          ↓
  BIẾN ĐỔI (ngoài kho)       Nạp THÔ vào kho
   ↓                          ↓
  Nạp bản đã sạch            BIẾN ĐỔI bằng SQL
                              trong chính kho
        ↓                          ↓
⚠ Kho chỉ chứa               ⚠ Kho giữ CẢ dữ liệu thô
  dữ liệu đạt chuẩn            → làm lại được khi
                                 luật nghiệp vụ đổi

⚠ Vì sao ETL vẫn hợp lý ở đây:

Yêu cầu của đề:
  "ensure data quality"
  "enforce business rules"
  "BEFORE it is loaded"
        ↓
    ⚠ Bên nghiệp vụ muốn kho
      KHÔNG BAO GIỜ chứa dữ liệu bẩn
        ↓
    → biến đổi phải ở TRƯỚC bước nạp
    → công cụ: Dataflow, Data Fusion,
      hoặc Dataproc

⚠ Đối chiếu ba câu dễ lẫn:

  • Câu này (#13152) khoá ETL — vì đề nhấn "trước khi nạp".
  • #13110 (lô 137) khoá ETLT — vì đề đó mô tả hai lần biến đổi: làm sạch/che dữ liệu nhạy cảm trước khi nạp, rồi mới mô hình hoá bằng SQL trong kho.
  • #12993 (lô 135) có ETLT là phương án SAI — vì đề đó chỉ có một lần biến đổi, sau khi nạp.

Ba câu KHÔNG mâu thuẫn. Quy tắc đọc đề: đếm xem có mấy lần biến đổi và chúng nằm trước hay sau bước nạp.

Vì sao các phương án khác sai

  • B (ELT) — phương án gần nhất và là kiểu hiện đại được ưa chuộng trên BigQuery. Nhưng ELT nạp dữ liệu thô trước rồi mới biến đổi bằng SQL — trái hẳn yêu cầu "làm sạch trước khi nạp" của đề.

  • D (ETLT) — có hai lần biến đổi. Đề chỉ mô tả một lần, ở trước bước nạp.

  • A (Data Replication) — sao chép dữ liệu y nguyên sang nơi khác, không có bước biến đổi nào. Đó là chuyện của Datastream hay công cụ CDC.

Ghi nhớ

⚠ Bốn mô hình dịch chuyển dữ liệu — bảng phải thuộc: | Mô hình | Đặc điểm | |---|---| | ETL | biến đổi TRƯỚC khi nạp — kho chỉ chứa dữ liệu sạch | | ELT | nạp thô rồi biến đổi bằng SQL trong kho — hiện đại, linh hoạt | | ETLT | làm sạch/che nhẹ trước, mô hình hoá sau — thường vì tuân thủ | | Replication / CDC | sao chép nguyên trạng, không biến đổi |

Từ khoá nhận diện:

"làm sạch TRƯỚC khi nạp" → ETL "nạp thô rồi biến đổi bằng SQL" → ELT "che PII trước khi nạp, mô hình hoá sau" → ETLT "giữ bản sao đồng bộ liên tục" → replication / CDC

Vì sao ELT thịnh hành trên BigQuery Lý do
Kho có sức tính toán rất lớn biến đổi ngay tại chỗ là rẻ
Giữ được dữ liệu thô làm lại được khi luật nghiệp vụ đổi
SQL dễ tiếp cận hơn mã pipeline
Dataform giúp quản lý chuỗi biến đổi SQL
⚠ Đánh đổi kho chứa cả dữ liệu bẩn — phải quản trị chặt
Khi nào ETL vẫn đúng hơn Trường hợp
Có quy định cấm PII thô vào kho
Dữ liệu quá lớn, lọc trước để tiết kiệm
Cần chuẩn hoá định dạng phức tạp khó làm bằng SQL
Kho tính tiền theo lượng lưu trữ và quét
Công cụ cho từng mô hình Công cụ
ETL Dataflow, Cloud Data Fusion, Dataproc
ELT Dataform, scheduled query, dbt
CDC Datastream
Điều phối chung Cloud Composer, Cloud Workflows

Ba việc kiểm chứng: | Việc | Cách | |---|---| | Dữ liệu vào kho có sạch không | Dataplex data quality hoặc Dataform assertion | | Có mất bản ghi khi biến đổi không | so số dòng vào và ra | | Làm lại được không nếu luật đổi | có còn giữ bản thô không |

Và một lời khuyên thực tế vượt ra ngoài phòng thi: kể cả khi chọn ETL, vẫn nên lưu một bản sao dữ liệu thô ở Cloud Storage. Luật nghiệp vụ sẽ đổi, và ngày đó bạn sẽ cần chạy lại toàn bộ lịch sử — nếu chỉ còn dữ liệu đã biến đổi thì không có đường lùi.

Câu 243 Data Preparation and Ingestion

A company plans to migrate 10 TB of historical data from its on-premises file server to a Google Cloud Storage bucket. The migration will occur over the office's main 150 Mbps internet connection, which is also critical for daily business operations like video conferencing and customer support.

To prevent disruption, the IT department has mandated that the data transfer process must not consume more than 60 Mbps of the available bandwidth at any given time. They need a managed Google Cloud service that can perform the transfer online while enforcing this specific bandwidth cap.

Which Google Cloud service and feature should they use to meet all these requirements?

  1. A

    Use a Transfer Appliance, a physical hardware device shipped to the on-premises data center, to perform an offline data transfer by loading the 10 TB of data locally and shipping the appliance back to Google for ingestion.

  2. B

    Run the gcloud storage cp command from the Cloud SDK on an on-premises server, scripting the file copy process and using OS-level utilities like tc or trickle to manually enforce the 60 Mbps bandwidth constraint.

  3. C

    Use Storage Transfer Service by installing transfer agents on-premises, then creating a transfer job in the Google Cloud Console that specifies a "Bandwidth limit" of 60 Mbps in the job's configuration settings to automatically manage the transfer rate.

  4. D

    Use Cloud Data Fusion to graphically design an ETL pipeline with a source connector for the on-premises file system and a sink connector for Google Cloud Storage, running it on a managed Dataproc cluster to handle the data movement.

Xem giải thích

Đáp án

C — Dùng Storage Transfer Service: cài transfer agent tại chỗ, tạo transfer job trên console và đặt "Bandwidth limit" 60 Mbps.

Vì sao đúng

Đề đặt bốn ràng buộc, và chỉ Storage Transfer Service (STS) thoả cả bốn:

⚠ Bốn ràng buộc, một lời đáp:

1. TRỰC TUYẾN (online)     → STS chạy qua Internet
2. CÓ QUẢN LÝ (managed)    → Google lo lịch, thử lại,
                             kiểm tra toàn vẹn
3. TỪ FILE SERVER TẠI CHỖ  → transfer agent chạy trong
                             mạng nội bộ, đọc hệ thống file
4. ⚠ GIỚI HẠN 60 Mbps      → tuỳ chọn "Bandwidth limit"
                             ngay trong cấu hình job

⚠ Kiến trúc STS cho nguồn tại chỗ:

File server nội bộ
        ↓ đọc
Transfer agent (chạy trong Docker)
   nhiều agent = một agent pool
        ↓ ⚠ chỉ kết nối RA NGOÀI
          → không cần mở cổng vào
        ↓ HTTPS
Storage Transfer Service (Google quản lý)
        ↓
Cloud Storage bucket
        ↓
    ⚠ Băng thông giới hạn ở
      MỨC AGENT POOL
    ⚠ Điều phối, thử lại, checksum
      đều do Google lo

⚠ Tính thời gian — vì sao vẫn nên chọn online:

10 TB ở 60 Mbps
   = 10 × 8.000.000 Mb ÷ 60 Mb/s
   ≈ 1.333.000 giây
   ≈ 15,4 ngày
        ↓
    ⚠ Lâu, nhưng CHẤP NHẬN ĐƯỢC
    ⚠ Và đề đã CHỈ ĐỊNH "online"
        ↓
    (Ngưỡng thường dùng: dưới ~10 TB
     hoặc dưới ~1 tuần thì chọn online;
     lớn hơn nhiều thì Transfer Appliance)

Vì sao các phương án khác sai

  • A (Transfer Appliance) — thiết bị vật lý cho chuyển ngoại tuyến. Đây là lựa chọn tốt cho hàng trăm TB, nhưng đề yêu cầu rõ "online", và với 10 TB thì chờ gửi thiết bị đi về còn lâu hơn.

  • B (gcloud storage cp + tc/trickle) — phương án gần nhất về mặt kết quả, nhưng không phải dịch vụ có quản lý: bạn tự viết script, tự lo thử lại, tự lo kiểm tra toàn vẹn, và giới hạn băng thông ở tầng hệ điều hành là thủ công, dễ sai. Đề đòi "a managed Google Cloud service".

  • D (Cloud Data Fusion) — công cụ ETL, không phải công cụ di chuyển dữ liệu số lượng lớn. Chạy cụm Dataproc chỉ để sao chép file là đắt và phức tạp vô ích, và không có nút giới hạn băng thông như STS.

Ghi nhớ

⚠ Bốn cách đưa dữ liệu lên Google Cloud — bảng phải thuộc: | Cách | Dùng khi | |---|---| | gcloud storage cp | vài GB, một lần, thủ công | | Storage Transfer Service | có quản lý, theo lịch, TỪ tại chỗ / S3 / Azure / URL | | Transfer Appliance | hàng trăm TB, đường truyền yếu — OFFLINE | | Cloud Interconnect / VPN | cần đường riêng lâu dài, băng thông lớn |

Từ khoá nhận diện:

"có quản lý + theo lịch + giới hạn băng thông" → Storage Transfer Service "hàng trăm TB, gửi thiết bị" → Transfer Appliance "từ S3 hoặc Azure Blob sang GCS" → Storage Transfer Service "đường truyền riêng, lâu dài" → Interconnect

Tính năng của Storage Transfer Service Tính năng
Giới hạn băng thông theo agent pool, đổi được lúc đang chạy
Lịch chạy một lần hoặc lặp lại
Chỉ chép file mới/đổi so theo thời gian sửa và checksum
Xoá nguồn sau khi chép tuỳ chọn
Lọc theo tiền tố chọn thư mục con
Kiểm tra toàn vẹn tự động, tự thử lại
Ghi log ra Cloud Logging
Transfer agent — điều cần biết Nội dung
Chạy bằng Docker container trong mạng nội bộ
Nhiều agent gộp thành agent pool, tăng thông lượng
Kết nối chỉ đi RA — không cần mở cổng vào firewall
Nguồn hỗ trợ hệ thống file POSIX, HDFS
Xác thực service account key hoặc Workload Identity
Chọn online hay offline — quy tắc thô Quy tắc
Tính thời gian trước dung lượng ÷ băng thông khả dụng
Dưới ~1 tuần online
Trên vài tuần cân nhắc Transfer Appliance
⚠ nhớ trừ băng thông dành cho hoạt động hằng ngày

Ba việc kiểm chứng: | Việc | Cách | |---|---| | Có đúng không vượt 60 Mbps | theo dõi trên router/firewall, không chỉ tin cấu hình | | Đã chép được bao nhiêu | trang chi tiết job — số byte, số file, số lỗi | | Có thiếu file nào không | so số lượng file hai đầu sau khi xong |

Và một chi tiết vận hành rất đáng nhớ: giới hạn băng thông của STS đổi được ngay khi job đang chạy. Cách làm thông minh trong thực tế là hạ xuống thấp trong giờ hành chính và nâng lên vào ban đêm — vẫn tôn trọng yêu cầu của bộ phận IT mà rút ngắn được đáng kể tổng thời gian chuyển.

Câu 244 Data Management

An administrator is configuring a Cloud SQL for PostgreSQL instance that serves a critical application. To ensure the database can survive a zonal failure with minimal downtime, they need to implement an automatic failover mechanism.

Which feature must they enable on the Cloud SQL instance?

  1. A High availability (HA) configuration
  2. B Cross-region read replicas
  3. C Point-in-time recovery
  4. D Automated backups
Xem giải thích

Đáp án

A — Cấu hình High Availability (HA).

Vì sao đúng

Chỉ cấu hình HA của Cloud SQL mới cho chuyển đổi dự phòng TỰ ĐỘNG khi mất một zone, và đó đúng là yêu cầu của đề.

⚠ HA hoạt động ra sao:

        Region us-central1
   ┌──────────────┬──────────────┐
   zone A          zone B
   PRIMARY  ═══→  STANDBY
   (đang phục vụ)  (bản sao ĐỒNG BỘ,
                    KHÔNG phục vụ đọc)
        ↓
    Ghi được xác nhận chỉ khi
    ĐÃ ghi ở CẢ HAI zone
        ↓
    ⚠ Zone A chết
        ↓
    Cloud SQL tự phát hiện
        ↓
    STANDBY thành PRIMARY
        ↓
    ⚠ Cùng ĐỊA CHỈ IP, cùng tên
    ⚠ Ứng dụng chỉ cần KẾT NỐI LẠI
    ⚠ Thường xong trong ~60 giây

⚠ Ba khái niệm rất hay bị nhầm lẫn:

HA (bản sao dự phòng)
    → chống MẤT ZONE
    → ⚠ TỰ ĐỘNG chuyển
    → standby KHÔNG đọc được

READ REPLICA
    → chống QUÁ TẢI ĐỌC / mất REGION
    → ⚠ chuyển đổi phải THỦ CÔNG
    → sao chép BẤT ĐỒNG BỘ → có thể mất dữ liệu

BACKUP / PITR
    → chống XOÁ NHẦM, HỎNG DỮ LIỆU
    → ⚠ phải KHÔI PHỤC — mất hàng chục phút
    → không phải cơ chế sẵn sàng cao

⚠ Vì sao ba phương án kia không đáp ứng "tự động":

Cross-region read replica
    → phải BẤM promote bằng tay
    → có thể mất giao dịch cuối
    (nhưng là lựa chọn ĐÚNG cho
     thảm hoạ cả REGION)

Point-in-time recovery
    → tạo instance MỚI từ thời điểm cũ
    → mất nhiều phút tới hàng giờ

Automated backups
    → điều kiện CẦN cho PITR và HA
    → nhưng bản thân không tự chuyển

Vì sao các phương án khác sai

  • B (bản sao đọc xuyên vùng) — phương án gần nhất, và đúng cho một đề khác: khi câu hỏi là mất cả một region. Ở đây đề nói zonal failure và tự động, mà promote replica là thao tác thủ công.

  • C (Point-in-time recovery) — dùng để quay về một mốc thời gian sau khi dữ liệu bị hỏng hoặc xoá nhầm. Không phải cơ chế sẵn sàng cao.

  • D (Sao lưu tự động) — cần thiết và là điều kiện tiên quyết để bật HA lẫn PITR, nhưng bản thân sao lưu không chuyển đổi gì cả.

Ghi nhớ

⚠ Bốn cơ chế bảo vệ của Cloud SQL — bảng phải thuộc: | Cơ chế | Chống được | Tự động? | |---|---|---| | HA (regional) | mất ZONE | CÓ, ~60 giây | | Read replica cùng vùng | quá tải đọc | không | | Cross-region replica | mất REGION | KHÔNG — promote thủ công | | Backup + PITR | xoá nhầm, hỏng dữ liệu | không |

Từ khoá nhận diện:

"mất zone + tự động + ít gián đoạn" → HA configuration "mất cả region" → cross-region replica (chấp nhận promote tay) "lỡ tay DELETE không có WHERE" → PITR "giảm tải cho instance chính" → read replica

Điều cần biết về HA của Cloud SQL Nội dung
Sao chép ĐỒNG BỘ giữa hai zone
RPO ≈ 0 — không mất giao dịch đã commit
RTO ~60 giây
Chi phí GẦN GẤP ĐÔI — trả tiền cho cả standby
⚠ Standby KHÔNG phục vụ đọc được
Điều kiện phải bật sao lưu tự động và binary log
Bật/tắt đổi được trên instance đang chạy
Chuẩn bị ứng dụng cho lúc chuyển đổi Việc
Bắt lỗi mất kết nối và thử lại ⚠ kết nối cũ SẼ đứt
Dùng connection pool có kiểm tra sức khoẻ
Đặt timeout hợp lý đừng treo vô hạn
Diễn tập bằng nút "Trigger failover" ⚠ thử trước khi sự cố thật xảy ra
RPO và RTO — hai từ phải phân biệt Từ
RPO mất bao nhiêu DỮ LIỆU (thời gian)
RTO mất bao nhiêu thời gian để PHỤC HỒI
HA RPO ≈ 0, RTO ≈ 60s
Cross-region replica RPO vài giây, RTO vài phút (thủ công)
Backup hằng ngày RPO tới 24 giờ
Thiết kế nhiều lớp — thực tế nên có cả ba Lớp
HA chuyện thường ngày — hỏng phần cứng, mất zone
Cross-region replica thảm hoạ vùng
Backup + PITR lỗi con người và lỗi ứng dụng
⚠ HA KHÔNG cứu được khi dữ liệu bị xoá nhầm — nó sao chép luôn lệnh xoá

Ba việc kiểm chứng: | Việc | Cách | |---|---| | HA đã bật chưa | gcloud sql instances describe → availabilityType: REGIONAL | | Chuyển đổi mất bao lâu thật | nút "Trigger failover" ở môi trường thử | | Ứng dụng có tự hồi không | quan sát log ứng dụng trong lúc diễn tập |

Và một điều rất dễ hiểu lầm mà đề thi hay nhắm vào: HA không phải là bản sao lưu. Standby phản chiếu mọi thứ primary làm, kể cả một câu DROP TABLE gõ nhầm — thứ duy nhất cứu được bạn khỏi lỗi ấy là backup và point-in-time recovery.

Câu 245 Data Management

An organization is implementing a Customer-Managed Encryption Key (CMEK) strategy for their data in Cloud Storage. Which Google Cloud service must they use to create, manage, and store their cryptographic keys?

  1. A Identity and Access Management (IAM)
  2. B Cloud Key Management Service (Cloud KMS)
  3. C Cloud HSM
  4. D Secret Manager
Xem giải thích

Đáp án

B — Cloud Key Management Service (Cloud KMS).

Vì sao đúng

CMEK có nghĩa là khoá do khách hàng quản lý, và Cloud KMS là dịch vụ tạo, lưu và quản lý khoá mã hoá trên Google Cloud.

⚠ CMEK hoạt động thế nào với Cloud Storage:

Tạo key ring và key trong Cloud KMS
        ↓
Cấp cho SERVICE AGENT của Cloud Storage
vai `cloudkms.cryptoKeyEncrypterDecrypter`
        ↓
Đặt khoá đó làm khoá mặc định của bucket
        ↓
    Ghi đối tượng
        ↓
    ⚠ Cloud Storage sinh khoá dữ liệu (DEK)
    ⚠ DEK được BỌC bằng khoá KMS (KEK)
    ⚠ ⚠ KHOÁ GỐC KHÔNG BAO GIỜ
      RỜI KHỎI Cloud KMS
        ↓
    Đọc đối tượng → KMS mở khoá DEK

⚠ Ba mức mã hoá — phải phân biệt:

GOOGLE-MANAGED (mặc định)
    → luôn bật, không phải làm gì
    → Google giữ khoá

CMEK
    → ⚠ KHOÁ TRONG CLOUD KMS,
      BẠN quản lý vòng đời
    → xoay khoá, tắt khoá, huỷ khoá
    → ⚠ TẮT KHOÁ = dữ liệu KHÔNG ĐỌC ĐƯỢC

CSEK
    → bạn tự giữ khoá NGOÀI Google
    → gửi kèm trong mỗi request
    → mất khoá là mất dữ liệu vĩnh viễn

⚠ Cloud HSM không phải dịch vụ riêng:

Cloud KMS có BA MỨC BẢO VỆ:
    SOFTWARE  → khoá trong phần mềm
    HSM       → ⚠ khoá trong thiết bị
                 FIPS 140-2 Level 3
    EXTERNAL  → khoá ở nhà cung cấp bên ngoài
        ↓
    ⚠ Cloud HSM là MỘT LỰA CHỌN
      BÊN TRONG Cloud KMS,
      không phải dịch vụ song song
        ↓
    → Câu trả lời cho "dịch vụ nào"
      vẫn là Cloud KMS

Vì sao các phương án khác sai

  • C (Cloud HSM) — phương án gần nhất và là bẫy chính: Cloud HSM thật sự lưu khoá, nhưng nó là mức bảo vệ HSM bên trong Cloud KMS, không phải một dịch vụ độc lập. Bạn vẫn tạo và quản lý khoá qua giao diện Cloud KMS.

  • A (IAM) — quản lý ai được làm gì, kể cả ai được dùng khoá. Nhưng nó không tạo và không lưu khoá mã hoá.

  • D (Secret Manager) — lưu bí mật của ứng dụng: mật khẩu, chuỗi kết nối, API key. Không phải khoá mã hoá dùng cho CMEK — hai loại "bí mật" khác nhau hoàn toàn.

Ghi nhớ

⚠ Bốn dịch vụ bảo mật hay bị lẫn — bảng phải thuộc: | Dịch vụ | Lưu gì | |---|---| | Cloud KMS | KHOÁ MÃ HOÁ — dùng cho CMEK | | Secret Manager | mật khẩu, API key, chuỗi kết nối | | IAM | quyền — ai làm được gì | | Certificate Manager | chứng chỉ TLS | | Sensitive Data Protection | phát hiện và che PII |

Từ khoá nhận diện:

"CMEK, khoá mã hoá, xoay khoá" → Cloud KMS "mật khẩu CSDL trong ứng dụng" → Secret Manager "FIPS 140-2 Level 3, thiết bị phần cứng" → mức bảo vệ HSM TRONG Cloud KMS "tự giữ khoá ngoài Google" → CSEK hoặc EKM

Phân cấp tài nguyên trong Cloud KMS Cấp
Key ring nhóm khoá, gắn với MỘT VỊ TRÍ
Key khoá logic
Key version phiên bản thực tế — xoay khoá tạo phiên bản mới
⚠ key ring KHÔNG xoá được — cân nhắc trước khi tạo
⚠ Vị trí khoá phải cùng vùng với dữ liệu
Vòng đời một khoá Trạng thái
Enabled dùng được
Disabled ⚠ dữ liệu mã hoá bằng nó KHÔNG đọc được
Scheduled for destruction có thời gian chờ, mặc định 24 giờ — huỷ được
Destroyed ⚠ KHÔNG khôi phục — dữ liệu mất vĩnh viễn
Xoay khoá tự động theo chu kỳ, dữ liệu cũ vẫn đọc bằng phiên bản cũ
Vì sao chọn CMEK Lý do
Yêu cầu tuân thủ ngành tài chính, y tế
Tự đặt chu kỳ xoay khoá
"Crypto-shredding" huỷ khoá = xoá dữ liệu tức thời về mặt thực tế
Có nhật ký mọi lần dùng khoá Cloud Audit Logs
⚠ Cái giá phí KMS + phí thao tác, và tự chịu trách nhiệm
Bẫy hay gặp với CMEK Bẫy
Quên cấp quyền cho service agent ⚠ ghi dữ liệu lỗi ngay
Khoá khác vùng với dữ liệu không dùng được
Tắt khoá khi còn dữ liệu đang dùng dịch vụ đứng ngay lập tức
Xoá key ring không xoá được, chỉ dọn khoá bên trong

Ba việc kiểm chứng: | Việc | Cách | |---|---| | Bucket đang dùng khoá nào | gcloud storage buckets describe → defaultKmsKeyName | | Ai đã dùng khoá | Cloud Audit Logs của Cloud KMS | | Khoá xoay đúng chu kỳ chưa | gcloud kms keys describe → rotationPeriod |

Và một điều nên xác lập ngay khi bật CMEK lần đầu: ai có quyền tắt hoặc huỷ khoá. Quyền đó mạnh ngang quyền xoá toàn bộ dữ liệu — chỉ khác là nó xảy ra tức thì và không có thùng rác để lục lại.

Câu 246

Which statement correctly describes how BigQuery resources are organized and how to reference a table?

  1. A

    Projects contain datasets; datasets contain tables, views, models, and routines; reference tables as project.dataset.table.

  2. B

    A dataset is optional; tables can be created directly in a project; reference tables as project.table.

  3. C

    Datasets contain projects; projects contain tables; reference as dataset.project.table.

  4. D

    Tables and views are top-level resources outside datasets; reference tables with only dataset.table.

Xem giải thích

Đáp án

A — Project chứa dataset; dataset chứa bảng, view, model và routine; tham chiếu bảng bằng project.dataset.table.

Vì sao đúng

Đây là mô tả đúng phân cấp tài nguyên của BigQuery, và cũng là cách viết tên đủ điều kiện mà mọi truy vấn dùng.

⚠ Phân cấp — ba tầng:

ORGANIZATION
   └── FOLDER
        └── PROJECT           ← ranh giới TÍNH TIỀN và IAM
             └── DATASET      ← ⚠ ranh giới VỊ TRÍ ĐỊA LÝ
                  ├── TABLE
                  ├── VIEW / MATERIALIZED VIEW
                  ├── MODEL (BigQuery ML)
                  ├── ROUTINE (hàm, thủ tục)
                  └── EXTERNAL TABLE

⚠ Cách viết tên trong truy vấn:

-- đủ điều kiện, luôn đúng
SELECT * FROM `du-an-abc.ban_hang.don_hang`;

-- bỏ project nếu truy vấn chạy trong chính project đó
SELECT * FROM ban_hang.don_hang;

-- ⚠ dấu backtick BẮT BUỘC khi tên
--   có dấu gạch ngang
SELECT * FROM `du-an-abc.ban_hang.don_hang`;
        ↓
    ⚠ KHÔNG có kiểu project.table
      — dataset là BẮT BUỘC

⚠ Vì sao dataset lại quan trọng đến vậy:

DATASET quyết định:
    1. ⚠ VỊ TRÍ ĐỊA LÝ (US, EU, asia-southeast1)
         → không đổi được sau khi tạo
         → ⚠ KHÔNG join được bảng khác vùng
    2. Ranh giới cấp quyền tiện nhất
    3. Thời gian sống mặc định của bảng
    4. Khoá CMEK mặc định
        ↓
    ⚠ Nghĩ kỹ về vị trí TRƯỚC khi tạo dataset

Vì sao các phương án khác sai

  • B (dataset là tuỳ chọn, tạo bảng thẳng trong project) — phương án gần nhất và sai ở một điểm dứt khoát: bảng BẮT BUỘC phải nằm trong một dataset. Không tồn tại dạng project.table.

  • C (dataset chứa project) — đảo ngược phân cấp. Project là cấp cao hơn.

  • D (bảng và view là tài nguyên cấp cao nhất) — sai hoàn toàn; và dataset.table chỉ là dạng rút gọn khi đã ở trong project đó, không phải cách tham chiếu duy nhất.

Ghi nhớ

⚠ Phân cấp BigQuery — bảng phải thuộc: | Cấp | Vai trò | |---|---| | Project | ranh giới TÍNH TIỀN, hạn ngạch, IAM | | Dataset | ranh giới VỊ TRÍ, đơn vị cấp quyền tự nhiên | | Table / View / Model / Routine | đối tượng thật | | Tham chiếu | project.dataset.table |

Từ khoá nhận diện:

"bảng nằm ở đâu" → trong dataset, luôn luôn "đổi vùng của dataset" → KHÔNG được — phải tạo mới và sao chép "join hai bảng khác vùng" → KHÔNG được — phải chuyển về cùng vùng "cấp quyền cho cả nhóm bảng" → cấp ở mức dataset

Các loại đối tượng trong dataset Loại
Table bảng gốc
View truy vấn lưu sẵn — chạy lại mỗi lần gọi
Materialized view kết quả được lưu, tự cập nhật tăng dần
External table / BigLake dữ liệu nằm ngoài
Model mô hình BigQuery ML
Routine UDF, thủ tục lưu, table function
Snapshot / Clone ảnh chụp và bản sao ghi-khi-thay-đổi
Cấp quyền ở mức nào Mức
Project rộng nhất — quản trị viên
Dataset hay dùng nhất — theo nhóm/chủ đề
Table / View mịn hơn
Cột policy tag
Dòng row access policy
Nguyên tắc quyền tối thiểu, thường dừng ở mức dataset
Vị trí dataset — ba điều phải nhớ Điều
Chọn lúc tạo, KHÔNG đổi được
Truy vấn không join được xuyên vùng ⚠ lỗi hay gặp nhất
Có yêu cầu chủ quyền dữ liệu thì chọn vùng cụ thể không dùng US đa vùng
Chuyển vùng dùng dataset copy hoặc xuất/nhập lại
Đặt tên có kỷ luật giúp gì Lợi ích
Dataset theo lớp: raw_, staging_, mart_ thấy ngay vị trí trong pipeline
Tách project theo môi trường: dev / staging / prod ranh giới hạn ngạch và chi phí rõ ràng
Nhãn (label) trên dataset báo cáo chi phí theo đội
⚠ tên có dấu gạch ngang phải bọc backtick

Ba việc kiểm chứng: | Việc | Cách | |---|---| | Dataset ở vùng nào | bq show --format=prettyjson <dataset> → location | | Có những gì trong dataset | bq ls <project>:<dataset> | | Ai có quyền gì | tab Sharing của dataset, hoặc bq show --format=json |

Và một quyết định nên cân nhắc thật kỹ ngay từ ngày đầu dựng kho: vị trí của dataset. Nó không đổi được, nó quyết định bảng nào join được với bảng nào, và sửa lại khi kho đã có hàng trăm bảng là một dự án di chuyển dữ liệu chứ không còn là một thao tác cấu hình.

Câu 247 Data Pipeline Orchestration

A team needs Python-based DAGs with retries and dependencies to orchestrate a nightly pipeline that launches a Dataflow template loading from Cloud Storage, then runs a BigQuery SQL transformation, and finally triggers a dashboard refresh; which service best fits these requirements?

  1. A

    Cloud Workflows to call services via HTTP without Airflow DAGs and operators.

  2. B

    Cloud Composer (managed Apache Airflow) using operators like DataflowTemplateOperator and BigQuery operators to model the DAG with dependencies and retries.

  3. C

    BigQuery scheduled queries to schedule the SQL step and coordinate the rest of the pipeline.

  4. D

    Cloud Scheduler jobs to cron-trigger each step separately.

Xem giải thích

Đáp án

B — Cloud Composer (Apache Airflow có quản lý), dùng DataflowTemplateOperator và các operator BigQuery để mô hình hoá DAG với phụ thuộc và thử lại.

Vì sao đúng

Đề dùng đúng những từ khoá của thế giới Airflow: "DAG viết bằng Python", "retries", "dependencies", và một chuỗi ba bước dữ liệu chạy hằng đêm.

⚠ Bốn yêu cầu ↔ Cloud Composer:

1. DAG BẰNG PYTHON
     → ⚠ Airflow định nghĩa DAG
       bằng chính mã Python

2. THỬ LẠI + PHỤ THUỘC
     → retries, retry_delay ở mức task
     → toán tử >> để khai phụ thuộc

3. GỌI DATAFLOW TEMPLATE
     → ⚠ DataflowTemplateOperator
       có SẴN, không phải tự viết

4. CHẠY SQL BIGQUERY
     → BigQueryInsertJobOperator có sẵn

⚠ DAG trông như thế này:

with DAG('pipeline_dem',
         schedule='0 2 * * *',
         default_args={'retries': 3,
                       'retry_delay': timedelta(minutes=5)}) as dag:

    nap = DataflowTemplateOperator(
        task_id='nap_tu_gcs',
        template='gs://.../template')

    bien_doi = BigQueryInsertJobOperator(
        task_id='bien_doi',
        configuration={'query': {'query': SQL}})

    lam_moi = SimpleHttpOperator(task_id='lam_moi_dashboard', ...)

    nap >> bien_doi >> lam_moi
        ↓
    ⚠ Một dòng cuối khai đủ phụ thuộc
    ⚠ Bước sau chỉ chạy khi bước trước THÀNH CÔNG
    ⚠ Giao diện Airflow: xem DAG, log,
      chạy lại đúng một task hỏng

⚠ Đối chiếu #13145 (cùng lô này) — đề đó khoá Cloud Workflows vì yêu cầu là "nhẹ nhàng nhất" cho ba lời gọi REST API. Câu này khoá Cloud Composer vì đề đòi DAG Python kiểu Airflow, có operator dựng sẵn cho Dataflow và BigQuery. Hai câu KHÔNG mâu thuẫn — chúng hỏi hai tình huống khác nhau.

Cách phân biệt khi làm bài: thấy chữ "Airflow", "DAG", "operator", "Python" → Composer. Thấy "nhẹ nhất", "serverless", "gọi REST API", "trả tiền theo bước" → Workflows.

Vì sao các phương án khác sai

  • A (Cloud Workflows) — phương án gần nhất, và đúng cho tình huống nhẹ hơn. Nhưng đề nói thẳng là muốn DAG Python và operator Airflow; chính lời văn của phương án A cũng thừa nhận "không có DAG và operator Airflow".

  • C (scheduled query của BigQuery) — chỉ lập lịch được bước SQL. Nó không khởi chạy được Dataflow, không điều phối phụ thuộc giữa các bước.

  • D (nhiều job Cloud Scheduler riêng lẻ) — mỗi job chạy độc lập theo giờ, không hề biết bước trước đã xong hay chưa. Đây là kiểu "điều phối bằng cách đoán thời gian" — bước trước chậm một chút là cả chuỗi sai.

Ghi nhớ

⚠ Composer hay Workflows — bảng quyết định: | Tiêu chí | Composer | Workflows | |---|---|---| | Định nghĩa | Python (Airflow) | YAML/JSON | | Chi phí | cụm chạy THƯỜNG TRỰC, tốn cả khi rảnh | theo BƯỚC, gần 0 khi rảnh | | Hệ sinh thái | hàng trăm operator dựng sẵn | connector Google Cloud + HTTP | | Giao diện | UI Airflow đầy đủ | xem thực thi trong console | | Hợp với | pipeline dữ liệu phức tạp, nhiều phụ thuộc | chuỗi lời gọi API nhẹ |

Từ khoá nhận diện:

"DAG, Airflow, operator, Python" → Cloud Composer "nhẹ nhất, serverless, gọi REST" → Cloud Workflows "chỉ chạy một câu SQL theo lịch" → scheduled query "chỉ cần cron kích hoạt một đích" → Cloud Scheduler

Operator hay dùng của Composer Operator
DataflowTemplateOperator chạy template Dataflow
BigQueryInsertJobOperator chạy SQL — thay cho các operator BigQuery cũ
GCSToBigQueryOperator nạp file vào bảng
DataprocSubmitJobOperator gửi job Spark
PythonOperator chạy hàm Python bất kỳ
Sensor chờ điều kiện — ví dụ file xuất hiện
TriggerDagRunOperator gọi DAG khác
Cấu hình thử lại trong Airflow Tham số
retries số lần thử lại
retry_delay khoảng chờ
retry_exponential_backoff lùi theo cấp số nhân
execution_timeout ⚠ chặn task treo mãi
on_failure_callback báo cảnh báo
depends_on_past chỉ chạy nếu lần trước thành công
Khái niệm Airflow phải nắm Khái niệm
DAG đồ thị có hướng, không chu trình
Task một bước
>> khai phụ thuộc
Backfill chạy bù các ngày quá khứ
catchup=False ⚠ tránh chạy bù ngoài ý muốn khi bật DAG
XCom truyền dữ liệu NHỎ giữa các task
⚠ đừng truyền dữ liệu lớn qua XCom — truyền đường dẫn
Cân nhắc chi phí Composer Điểm
Chạy trên GKE thường trực tốn cả khi không có DAG nào chạy
Composer 2/3 mở rộng tự động rẻ hơn bản 1
Đáng dùng khi nhiều pipeline, nhiều đội dùng chung
Không đáng khi chỉ có một job đơn giản mỗi đêm

Ba việc kiểm chứng: | Việc | Cách | |---|---| | DAG chạy tới đâu | Graph view trong UI Airflow | | Task nào hỏng | xem log task, chạy lại đúng task đó | | Có chạy bù ngoài ý muốn không | ⚠ kiểm catchup và start_date |

Và một cái bẫy khiến rất nhiều người mất một buổi sáng khi bật DAG đầu tiên: catchup mặc định là bật. Một DAG có start_date từ đầu năm sẽ lập tức xếp hàng chạy bù hàng trăm lần thực thi ngay khi được kích hoạt — hãy đặt catchup=False trừ khi bạn thật sự muốn chạy lại quá khứ.

Câu 248 Data Preparation and Ingestion

A data analyst has a BigQuery table named customer_feedback with a review_text column that contains leading and trailing whitespace. They need to clean this data for analysis.

Which SQL function should they use in their SELECT statement to remove this unwanted whitespace?

  1. A FORMAT(review_text)
  2. B TRIM(review_text)
  3. C STRIP(review_text)
  4. D CLEAN(review_text)
Xem giải thích

Đáp án

B — TRIM(review_text)

Vì sao đúng

TRIM là hàm chuẩn của GoogleSQL (ngôn ngữ SQL của BigQuery) để cắt khoảng trắng ở đầu và cuối chuỗi.

⚠ Ba hàm cùng họ:

SELECT
  TRIM('  xin chào  ')   AS ca_hai_dau,  -- 'xin chào'
  LTRIM('  xin chào  ')  AS ben_trai,    -- 'xin chào  '
  RTRIM('  xin chào  ')  AS ben_phai;    -- '  xin chào'
        ↓
    TRIM   → cắt CẢ HAI đầu  ← đề này
    LTRIM  → chỉ bên TRÁI
    RTRIM  → chỉ bên PHẢI

⚠ TRIM còn cắt được ký tự khác khoảng trắng:

SELECT TRIM('***khuyến mãi***', '*');
-- → 'khuyến mãi'

SELECT TRIM('$1.234,00', '$,');
-- → '1.234.00' — cắt mọi ký tự có trong tập
        ↓
    ⚠ Tham số thứ hai là TẬP KÝ TỰ,
      không phải một chuỗi con

⚠ Vì sao ba tên kia không tồn tại trong GoogleSQL:

STRIP()   → ⚠ đó là PYTHON (.strip()),
             KHÔNG có trong BigQuery

CLEAN()   → không tồn tại

FORMAT()  → CÓ tồn tại nhưng để
             ĐỊNH DẠNG chuỗi,
             không cắt khoảng trắng
             FORMAT('%s có %d đơn', ten, n)

Vì sao các phương án khác sai

  • A (FORMAT) — phương án gần nhất vì hàm này có thật, nhưng việc của nó là dựng chuỗi theo mẫu (giống printf), hoàn toàn không liên quan tới cắt khoảng trắng.

  • C (STRIP) — tên hàm của Python, không có trong GoogleSQL. Chạy sẽ báo Function not found.

  • D (CLEAN) — không tồn tại trong BigQuery.

Ghi nhớ

⚠ Hàm chuỗi hay dùng trong BigQuery — bảng phải thuộc: | Hàm | Việc | |---|---| | TRIM / LTRIM / RTRIM | cắt khoảng trắng hoặc ký tự ở rìa | | UPPER / LOWER | đổi hoa thường | | CONCAT hoặc \|\| | nối chuỗi | | SUBSTR | cắt đoạn con | | SPLIT | tách thành mảng | | REPLACE | thay chuỗi con | | REGEXP_REPLACE | thay theo biểu thức chính quy | | LENGTH | độ dài ký tự | | NORMALIZE | chuẩn hoá Unicode — rất quan trọng với tiếng Việt |

Từ khoá nhận diện:

"khoảng trắng thừa ở đầu/cuối" → TRIM "khoảng trắng thừa Ở GIỮA" → REGEXP_REPLACE(x, r'\\s+', ' ') "so sánh không phân biệt hoa thường" → LOWER cả hai vế "tách chuỗi thành nhiều dòng" → SPLIT + UNNEST

Làm sạch văn bản — thứ tự nên theo Bước
1 TRIM — cắt rìa
2 REGEXP_REPLACE(x, r'\\s+', ' ') — gộp khoảng trắng giữa
3 LOWER — nếu cần so khớp
4 NORMALIZE(x, NFC) — chuẩn hoá dấu tiếng Việt
5 NULLIF(x, '') — chuỗi rỗng thành NULL
⚠ Vì sao NORMALIZE quan trọng với tiếng Việt Lý do
Chữ "ế" có hai cách mã hoá Unicode dựng sẵn hoặc tổ hợp
Hai chuỗi nhìn giống hệt nhau vẫn KHÔNG bằng nhau
Hậu quả GROUP BY tách làm hai nhóm, JOIN trượt
Chữa NORMALIZE(x, NFC) trước khi so sánh
Nên làm sạch ở đâu Nơi
Trong pipeline nạp dữ liệu vào kho đã sạch
Trong view / Dataform giữ bản thô, sạch ở tầng mô hình
Trong từng truy vấn ⚠ dễ quên, mỗi người làm một kiểu
Thực hành tốt một view chuẩn hoá dùng chung cho cả đội

Ba việc kiểm chứng: | Việc | Cách | |---|---| | Còn bao nhiêu dòng dính khoảng trắng | COUNTIF(x != TRIM(x)) | | Có chuỗi rỗng ẩn không | COUNTIF(TRIM(x) = '') | | Có bao nhiêu giá trị phân biệt sau khi sạch | so COUNT(DISTINCT x) với COUNT(DISTINCT TRIM(LOWER(x))) |

Và một phép kiểm tra rất đáng chạy trên mọi cột văn bản mới nhận về: đếm số giá trị phân biệt trước và sau khi chuẩn hoá. Chênh lệch lớn giữa hai con số là bằng chứng trực tiếp rằng dữ liệu đang bị phân mảnh vì khoảng trắng và hoa thường — và mọi báo cáo nhóm theo cột đó đều đang đếm sai.

Câu 249
Your retail company wants to predict customer churn using historical purchase data stored in BigQuery. The dataset includes customer demographics, purchase history, and a label indicating whether the customer churned or not. You want to build a machine learning model to identify customers at risk of churning. You need to create and train a logistic regression model for predicting customer churn, using the customer_data table with the churned column as the target label. Which BigQuery ML query should you use?
  1. A
    CREATE OR REPLACE MODEL churn_prediction_model
    OPTIONS (model_type='logistic_reg') AS
    SELECT *
    FROM customer_data;

    -------------------------
  2. B
    CREATE OR REPLACE MODEL churn_prediction_model
    OPTIONS (model_type='logistic_reg') AS
    SELECT * EXCEPT(churned),
            churned AS label
    FROM customer_data;

    -------------------------
  3. C
    CREATE OR REPLACE MODEL churn_prediction_model OPTIONS(model_type='logistic_reg') AS 
    SELECT * EXCEPT (churned) 
    FROM customer_data;

    -------------------------
  4. D
    CREATE OR REPLACE MODEL churn_prediction_model
    OPTIONS (model_type='logistic_reg') AS
    SELECT churned as label
    FROM customer_data;

    -------------------------
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 xây dựng mô hình Machine Learning trong BigQuery ML (một dịch vụ của Google Cloud Platform - GCP) để dự đoán customer churn (khách hàng rời bỏ) dựa trên dữ liệu lịch sử mua sắm lưu trữ trong bảng customer_data. Dữ liệu bao gồm thông tin nhân khẩu học, lịch sử mua hàng và cột churned làm nhãn mục tiêu (target label - 1 nếu churn, 0 nếu không).

📌 Yêu cầu chính: Tạo và huấn luyện mô hình logistic regression (model_type='logistic_reg') bằng câu lệnh CREATE OR REPLACE MODEL. Câu lệnh phải:

  • Chỉ định tên model: churn_prediction_model.
  • Sử dụng bảng customer_data.
  • Tách biệt features (các đặc trưng đầu vào như demographics, purchase history) và label (churned).
  • Tuân thủ quy tắc BigQuery ML: Đối với phân loại nhị phân (binary classification) như logistic regression, query phải cung cấp tất cả features (không bao gồm label) và label riêng biệt (alias là label).

🛠️ Lưu ý kỹ thuật từ BigQuery ML (cập nhật đến 2026):

✅ Đáp án đúng

Đáp án đúng là lựa chọn thứ 2:

<code><pre>CREATE OR REPLACE MODEL churn_prediction_model
OPTIONS (model_type='logistic_reg') AS
SELECT * EXCEPT(churned),
        churned AS label
FROM customer_data;</pre></code>

Lý do lựa chọn:

  • 🟢 Query này hoàn hảo vì sử dụng * EXCEPT(churned) để chọn tất cả features (loại trừ cột churned), sau đó thêm churned AS label làm nhãn mục tiêu riêng biệt.
  • Đảm bảo không data leakage (label không lẫn vào features), phù hợp cho logistic regression binary classification.
  • BigQuery ML sẽ tự động huấn luyện model với input chuẩn, dự đoán churn risk chính xác. ✅

📋 Giải thích chi tiết tất cả các phương án

  • Phương án 1 (Sai ❌):

    <code><pre>CREATE OR REPLACE MODEL churn_prediction_model
    OPTIONS (model_type='logistic_reg') AS
    SELECT *
    FROM customer_data;</pre></code>
    

    Giải thích sai: Query chọn * (tất cả cột), nên cột churned bị lẫn vào features, gây data leakage nghiêm trọng. BigQuery ML sẽ báo lỗi hoặc model kém chất lượng vì label không được tách biệt và alias là label. Không tuân thủ quy tắc bắt buộc của BQML. ❌

  • Phương án 2 (Đúng ✅): (Như đã giải thích ở trên - hoàn chỉnh và chuẩn xác). 🟢

  • Phương án 3 (Sai ❌):

    <code><pre>CREATE OR REPLACE MODEL churn_prediction_model OPTIONS(model_type='logistic_reg') AS 
    SELECT * EXCEPT (churned) 
    FROM customer_data;</pre></code>
    

    Giải thích sai: Query chỉ chọn * EXCEPT(churned) (features đầy đủ), nhưng thiếu hoàn toàn cột label (churned AS label). BigQuery ML yêu cầu bắt buộc có cột label cho supervised learning như logistic regression, nên sẽ báo lỗi "No label column". ❌

  • Phương án 4 (Sai ❌):

    <code><pre>CREATE OR REPLACE MODEL churn_prediction_model
    OPTIONS (model_type='logistic_reg') AS
    SELECT churned as label
    FROM customer_data;</pre></code>
    

    Giải thích sai: Query chỉ chọn churned as label (có label đúng), nhưng thiếu tất cả features (demographics, purchase history). Model không có input để học, BigQuery ML sẽ báo lỗi thiếu features hoặc model vô nghĩa (không dự đoán được churn dựa trên dữ liệu). ❌

📘 Tài liệu tham khảo bổ sung

Hy vọng phân tích này giúp bạn nắm vững BigQuery ML! 🚀 Nếu cần ví dụ thực hành, hãy hỏi thêm.

Câu 250
Your company has several retail locations. Your company tracks the total number of sales made at each location each day. You want to use SQL to calculate the weekly moving average of sales by location to identify trends for each store. Which query should you use?
  1. A
    SELECT store_id, date, total_sales, 
           AVG(total_sales) OVER (
               PARTITION BY store_id
               ORDER BY total_sales
               RANGE BETWEEN 6 PRECEDING AND CURRENT ROW
           ) AS rolling_avg
    FROM store_sales_daily;

    -------------------------
  2. B
    SELECT store_id, date, total_sales, 
           AVG(total_sales) 
           OVER ( 
               PARTITION BY date 
               ORDER BY store_id 
               ROWS BETWEEN 6 PRECEDING AND CURRENT ROW 
           ) as rolling_avg
    FROM store_sales_daily

    -------------------------
  3. C
    SELECT 
        store_id, 
        date, 
        total_sales, 
        AVG(total_sales) 
        OVER (
            PARTITION BY store_id
            ORDER BY date 
            ROWS BETWEEN 6 PRECEDING AND CURRENT ROW
        ) as rolling_avg
    FROM store_sales_daily

    -------------------------
  4. D
    SELECT 
        store_id, 
        date, 
        total_sales, 
        AVG(total_sales) 
    OVER (
        PARTITION BY total_sales
        ORDER BY date 
        RANGE BETWEEN 6 PRECEDING AND CURRENT ROW
    ) AS rolling_avg
    FROM store_sales_daily

    -------------------------
Xem giải thích

🧩 Phân tích nội dung câu hỏi

Câu hỏi yêu cầu sử dụng SQL để tính trung bình di động hàng tuần (weekly moving average) của tổng doanh số bán hàng (total_sales) theo từng cửa hàng (store_id), dựa trên dữ liệu hàng ngày từ bảng store_sales_daily. Mục tiêu là xác định xu hướng doanh số cho từng cửa hàng riêng lẻ.

  • Yêu cầu chính:
    • Phân vùng (PARTITION) theo store_id để tính riêng cho từng cửa hàng. ✅
    • Sắp xếp (ORDER BY) theo date để đảm bảo tính theo thứ tự thời gian. ✅
    • Sử dụng cửa sổ trượt (window frame) với 6 hàng trước đó + hàng hiện tại (tổng 7 hàng, tương đương 1 tuần nếu dữ liệu hàng ngày). 🛠️

Điều này sử dụng hàm cửa sổ AVG() OVER() trong SQL (hỗ trợ đầy đủ trên Amazon Redshift, Athena, và các dịch vụ AWS khác đến phiên bản 2026). 📘

✅ Đáp án đúng và lý do lựa chọn

Đáp án đúng là phương án thứ 3 (đã đánh dấu [ĐÚNG]):

SELECT 
    store_id, 
    date, 
    total_sales, 
    AVG(total_sales) 
    OVER (
        PARTITION BY store_id
        ORDER BY date 
        ROWS BETWEEN 6 PRECEDING AND CURRENT ROW
    ) as rolling_avg
FROM store_sales_daily

Lý do:

  • PARTITION BY store_id: Đúng vì tính trung bình riêng cho từng cửa hàng, tránh lẫn dữ liệu giữa các store. 🏪
  • ORDER BY date: Đúng vì di động theo thời gian (daily data), đảm bảo cửa sổ trượt theo thứ tự ngày. 📅
  • ROWS BETWEEN 6 PRECEDING AND CURRENT ROW: Chính xác cho 7 hàng gần nhất (6 ngày trước + hiện tại), phù hợp weekly moving average trên dữ liệu discrete rows. ROWS đếm physical rows, lý tưởng cho daily distinct dates. 🚀
  • Kết quả: Mỗi hàng sẽ có rolling_avg là trung bình 7 ngày gần nhất của store đó, giúp phát hiện xu hướng.

🛠️ Giải thích chi tiết từng phương án

Dưới đây là phân tích tất cả 4 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 cụ thể dựa trên SQL window functions (AWS Redshift v2.0+ và Athena 2026). ❌ cho sai, ✅ cho đúng.

  • Phương án 1 [SAI] ❌

    SELECT store_id, date, total_sales, 
           AVG(total_sales) OVER (
               PARTITION BY store_id
               ORDER BY total_sales
               RANGE BETWEEN 6 PRECEDING AND CURRENT ROW
           ) AS rolling_avg
    FROM store_sales_daily;
    

    Lý do sai:

    • ORDER BY total_sales thay vì date → Cửa sổ trượt theo giá trị doanh số (không theo thời gian), dẫn đến thứ tự ngẫu nhiên, không phản ánh xu hướng hàng tuần. Sai hoàn toàn! 😵
    • RANGE thay vì ROWS: RANGE dựa trên giá trị (peer rows có cùng total_sales), có thể bao gồm nhiều hơn 7 ngày nếu sales trùng lặp. Không phù hợp cho moving average thời gian.
  • Phương án 2 [SAI] ❌

    SELECT store_id, date, total_sales, 
           AVG(total_sales) 
           OVER ( 
               PARTITION BY date 
               ORDER BY store_id 
               ROWS BETWEEN 6 PRECEDING AND CURRENT ROW 
           ) as rolling_avg
    FROM store_sales_daily
    

    Lý do sai:

    • PARTITION BY date → Nhóm theo ngày thay vì store_id, tính trung bình tất cả stores cùng ngày, không phân tích xu hướng theo từng cửa hàng. Sai mục tiêu! 🏪❌
    • ORDER BY store_id → Sắp xếp theo ID cửa hàng, không theo thời gian, cửa sổ trượt vô nghĩa cho weekly trend.
  • Phương án 3 [ĐÚNG] ✅

    SELECT 
        store_id, 
        date, 
        total_sales, 
        AVG(total_sales) 
        OVER (
            PARTITION BY store_id
            ORDER BY date 
            ROWS BETWEEN 6 PRECEDING AND CURRENT ROW
        ) as rolling_avg
    FROM store_sales_daily
    

    Lý do đúng: Như đã giải thích ở phần trên. Hoàn hảo cho yêu cầu! 🌟 (ROWS chính xác vì đếm exact 7 rows theo date order).

  • Phương án 4 [SAI] ❌

    SELECT 
        store_id, 
        date, 
        total_sales, 
        AVG(total_sales) 
    OVER (
        PARTITION BY total_sales
        ORDER BY date 
        RANGE BETWEEN 6 PRECEDING AND CURRENT ROW
    ) AS rolling_avg
    FROM store_sales_daily
    

    Lý do sai:

    • PARTITION BY total_sales → Nhóm theo giá trị doanh số, không theo store_id → Kết quả lẫn lộn giữa các cửa hàng có sales giống nhau, không xác định xu hướng per store. Hoàn toàn sai! 💥
    • RANGE: Có thể mở rộng ngoài 7 ngày nếu nhiều rows có total_sales giống nhau trong range.

📘 Tài liệu tham khảo (AWS cập nhật 2026)

Phân tích này dựa trên best practices AWS SQL đến 2026. Nếu cần query test, hãy cung cấp sample data! 🧪