Ngân hàng đề — Microsoft Azure Data Engineer

Tìm thấy 228 câu.

Câu 181 Chọn nhiều đáp án
You have an Azure Data Lake Storage Gen2 account named storage1.

You plan to implement query acceleration for storage1.

Which two file types support query acceleration? Each correct answer presents a complete solution.

NOTE: Each correct selection is worth one point.
  1. A JSON
  2. B Apache Parquet
  3. C XML
  4. D CSV
  5. E Avro
Xem giải thích

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

Câu hỏi trắc nghiệm này thuộc lĩnh vực Azure Data Lake Storage Gen2 (ADLS Gen2), một dịch vụ lưu trữ dữ liệu lớn của Microsoft Azure được tối ưu hóa cho phân tích dữ liệu (analytics workloads). Nội dung chính:
Bạn có một tài khoản ADLS Gen2 tên storage1, và dự định triển khai query acceleration cho tài khoản này. Câu hỏi yêu cầu chọn hai loại file hỗ trợ tính năng query acceleration. Đây là câu hỏi multi-select (mỗi lựa chọn đúng đáng 1 điểm), nghĩa là cần chọn đúng hai đáp án hoàn chỉnh.

Query acceleration là tính năng mới của Azure Storage (tích hợp trong ADLS Gen2), giúp tăng tốc truy vấn phân tích bằng cách:

  • Sử dụng pushdown optimizations (tối ưu hóa đẩy xuống).
  • Dựa trên file/row-group statistics (thống kê min/max, count, v.v.) để skip tự động các file hoặc row groups không khớp với điều kiện truy vấn (predicate).
  • Giảm I/O, tăng hiệu suất lên đến 5x cho workload lớn, thường dùng với công cụ như Azure Synapse Analytics, Databricks, hoặc Azure Data Explorer.
    Tính năng này không áp dụng cho tất cả file format, mà chỉ hỗ trợ các định dạng có thống kê metadata phù hợp (columnar hoặc có thể infer stats).

Dựa trên kiến thức cập nhật mới nhất đến năm 2026 (phiên bản Azure Storage v2024-11-04 và các bản cập nhật GA/preview), tính năng này hỗ trợ Apache Parquet (GA) và CSV (public preview, dự kiến GA đầy đủ vào 2025-2026).

📘 Tài liệu tham khảo chính:

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

Hai đáp án đúng là:
🟢 Apache Parquet
🟢 CSV

Lý do chọn:

  • Đây là hai định dạng duy nhất được Azure Storage chính thức hỗ trợ cho query acceleration theo docs mới nhất (Parquet ở GA từ 2023, CSV ở public preview từ giữa 2024, với feature flag enable).
  • Chúng cung cấp thống kê metadata (min/max, null count) cần thiết để engine skip dữ liệu không liên quan, tăng tốc truy vấn lớn (hàng TB).
  • Câu hỏi yêu cầu hai file types, khớp chính xác với supported formats hiện tại (không có ORC hoặc Delta trực tiếp liệt kê ở lựa chọn). Đến 2026, CSV dự kiến GA đầy đủ mà không cần preview flag.

🛠️ Giải thích chi tiết 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, giữ nguyên văn bản gốc tiếng Anh. Mỗi phần giải thích tại sao đúng/sai dựa trên cơ chế kỹ thuật và docs Azure (2024-2026):

  • JSON ❌ SAI
    JSON là định dạng row-based, không có built-in columnar stats (min/max per column). Query acceleration yêu cầu metadata thống kê để pushdown predicates, JSON chỉ hỗ trợ query cơ bản qua Synapse serverless nhưng không được tối ưu hóa acceleration (không skip file hiệu quả, dẫn đến full scan chậm). Docs xác nhận không hỗ trợ.

  • Apache Parquet ✅ ĐÚNG
    Parquet là định dạng columnar với footer metadata chi tiết (min/max, bloom filters per row group/column). Query acceleration sử dụng trực tiếp stats này để skip row groups/file, hỗ trợ GA đầy đủ từ 2023. Đây là định dạng chính, hiệu suất cao nhất cho analytics.

  • XML ❌ SAI
    XML là markup language row-oriented, không columnar, không có stats metadata chuẩn. Azure không hỗ trợ query acceleration trên XML (chỉ parse cơ bản qua công cụ như Synapse, nhưng full scan chậm, không pushdown). Hoàn toàn không supported theo docs.

  • CSV ✅ ĐÚNG
    CSV hỗ trợ query acceleration ở public preview (enable qua feature flag "AllowQueryAccelerationForCsv"). Azure infer stats (min/max) từ header/data mẫu, cho phép skip lines/files. Phù hợp workload semi-structured lớn, dự kiến GA 2025-2026. Docs liệt kê rõ supported in preview.

  • Avro ❌ SAI
    Avro là row-based binary (schema-embedded), không columnar stats như Parquet. Mặc dù Synapse query được Avro, nhưng query acceleration không hỗ trợ (thiếu pushdown stats hiệu quả). Docs không đề cập, chỉ Parquet/CSV.

Kết luận nổi bật 🎯: Chọn Apache Parquet và CSV để đạt điểm đầy đủ. Tránh nhầm lẫn với các tính năng query khác của Synapse (như CETAS cho JSON/Avro). Nếu triển khai, enable qua Azure Portal > Storage Account > Data Lake > Query Acceleration! 🚀

Câu 182
You have an Azure Data Factory pipeline named pipeline1 that is invoked by a tumbling window trigger named Trigger1. Trigger1 has a recurrence of 60 minutes.
You need to ensure that pipeline1 will execute only if the previous execution completes successfully.
How should you configure the self-dependency for Trigger1?
  1. A offset: "-00:01:00" size: "00:01:00"
  2. B offset: "01:00:00" size: "-01:00:00"
  3. C offset: "01:00:00" size: "01:00:00"
  4. D offset: "-01:00:00" size: "01:00:00"
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 Azure Data Factory (ADF), một dịch vụ ETL/ELT trên Azure để xây dựng pipeline dữ liệu. Cụ thể:

  • Bạn có một pipeline tên pipeline1 được kích hoạt bởi tumbling window trigger tên Trigger1 với recurrence 60 phút (tức chạy mỗi giờ, ví dụ: 12:00-13:00, 13:00-14:00, v.v.).
  • Yêu cầu: Đảm bảo pipeline1 chỉ thực thi nếu execution trước đó hoàn thành thành công (successful completion). Điều này sử dụng cơ chế self-dependency của tumbling window trigger.
  • Self-dependency là tính năng cho phép trigger hiện tại phụ thuộc vào kết quả của một window kích hoạt trước đó (thường là window liền kề trước). Nếu window dependency thất bại hoặc chưa hoàn thành, trigger sẽ skip (bỏ qua) execution.
  • Cấu hình cần thiết: Sử dụng offset (khoảng cách thời gian từ window hiện tại đến window dependency, định dạng ISO 8601 như "hh:mm:ss") và size (kích thước window dependency, thường bằng window size của trigger chính).

📘 Kiến thức cập nhật: Theo tài liệu Azure Data Factory phiên bản mới nhất (tính đến 2026, ADF v2.x với hỗ trợ tumbling window trigger nâng cao), self-dependency yêu cầu offset âm để trỏ về window trước (ví dụ -1 giờ cho previous window), và size dương bằng recurrence interval. Không liên quan AWS (có thể là nhầm lẫn chủ đề).

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

Đáp án đúng: offset: "-01:00:00" size: "01:00:00"

Lý do 🛠️:

  • Với recurrence 60 phút (1 giờ), window hiện tại (ví dụ 13:00-14:00) cần phụ thuộc vào window trước đó (12:00-13:00).
  • offset: "-01:00:00": Di chuyển lùi 1 giờ từ start time của window hiện tại → trỏ chính xác vào start time của previous window.
  • size: "01:00:00": Kích thước dependency window = 1 giờ (bằng recurrence), đảm bảo kiểm tra toàn bộ execution trước.
  • Kết quả: Nếu previous window fail hoặc pending → trigger skip pipeline1 hiện tại. Hoàn hảo khớp yêu cầu!

❌ Giải thích 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 tiếng Anh. Tôi đánh dấu sai/đúng theo yêu cầu, với giải thích chi tiết bằng tiếng Việt:

  • offset: "-00:01:00" size: "00:01:00" ❌
    Sai vì: Offset chỉ lùi 1 phút (quá nhỏ so với recurrence 1 giờ), không trỏ được vào previous window đầy đủ. Size 1 phút cũng không khớp kích thước window (1 giờ), dẫn đến dependency không chính xác → pipeline có thể chạy dù previous chưa hoàn thành.

  • offset: "01:00:00" size: "-01:00:00" ❌
    Sai vì: Offset dương (tiến 1 giờ) trỏ vào tương lai (next window), không phải previous. Size âm không hợp lệ (size phải dương theo docs ADF) → cấu hình lỗi, trigger không hoạt động self-dependency đúng.

  • offset: "01:00:00" size: "01:00:00" ❌
    Sai vì: Offset dương tiến 1 giờ → dependency vào window sau (tương lai), vô nghĩa cho self-dependency previous execution. Không đảm bảo chỉ chạy nếu previous thành công.

  • offset: "-01:00:00" size: "01:00:00" ✅
    Đúng vì: Như giải thích ở trên, offset lùi đúng 1 giờ + size khớp 1 giờ → dependency hoàn hảo vào immediate previous window. Pipeline chỉ chạy nếu execution trước successful!

📘 Tài liệu tham khảo

Hy vọng phân tích này giúp bạn nắm vững tumbling window trigger! 🚀 Nếu cần demo pipeline, hỏi nhé!

Câu 183
You have an Azure subscription that contains the resources shown in the following table.



You need to read the files in storage1 by using ad-hoc queries and the OPENROWSET function. The solution must ensure that each rowset contains a single JSON record.

To what should you set the FORMAT option of the OPENROWSET function?
  1. A JSON
  2. B DELTA
  3. C PARQUET
  4. D CSV
Xem giải thích

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

Câu hỏi thuộc chứng chỉ Microsoft Azure Data Engineer Associate (DP-203), tập trung vào Azure Synapse Analytics (workspace WS1 chứa serverless SQL pool). Tình huống: Bạn có tài nguyên storage1 (Azure Blob Storage account chứa các file JSON công khai - publicly accessible) và cần đọc file từ storage1 bằng ad-hoc queries sử dụng hàm OPENROWSET trong serverless SQL pool.

📍 Yêu cầu chính: Mỗi rowset (kết quả trả về từ OPENROWSET) phải chứa chỉ một JSON record duy nhất (single JSON record). Nghĩa là, cấu hình FORMAT option của OPENROWSET phải xử lý file JSON sao cho mỗi dòng kết quả đại diện cho một object JSON hoàn chỉnh, không phải đọc như dữ liệu tabular thông thường.

🛠️ Ngữ cảnh kỹ thuật (dựa trên kiến thức Azure Synapse cập nhật đến 2026):

  • Serverless SQL pool trong Synapse hỗ trợ OPENROWSET(BULK) để đọc dữ liệu từ Blob Storage qua URL HTTPS (vì file public).
  • Các format hỗ trợ chính: CSV, PARQUET, DELTA.
  • Với JSON files chứa single JSON object per file (không phải JSON array hoặc multi-line), không có format 'JSON' trực tiếp. Thay vào đó, dùng trick với FORMAT='CSV' + terminators đặc biệt (FIELDTERMINATOR=0x0b, ROWTERMINATOR=0x0b) để treat toàn bộ file như một "single field CSV record", sau đó parse bằng AS JSON.

📸 Phân tích nội dung hình ảnh (bảng tài nguyên)

Hình ảnh hiển thị bảng resources trong Azure subscription:

Name Type Description
storage1 Azure Blob Storage account Contains publicly accessible JSON files
WS1 Azure Synapse Analytics workspace Contains a serverless SQL pool

✅ Ý nghĩa:

  • storage1: Container JSON public → Dễ truy cập qua OPENROWSET mà không cần credential (SAS/identity).
  • WS1: Serverless SQL pool → Hỗ trợ ad-hoc queries với OPENROWSET từ external storage.

✅ Đáp án đúng: CSV

Lý do lựa chọn (dựa trên docs Azure Synapse mới nhất 2026):
Để đọc single JSON record per file, phải set FORMAT = 'CSV' kết hợp terminators 0x0b (vertical tab). Cú pháp mẫu:

SELECT * FROM OPENROWSET(
  BULK 'https://storage1.blob.core.windows.net/container/*.json',
  FORMAT = 'CSV',
  FIELDTERMINATOR = 0x0b,
  FIELDQUOTE = 0x0b,
  ROWTERMINATOR = 0x0b
) WITH (json_data NVARCHAR(MAX) AS JSON) AS r;

🧩 Tại sao hiệu quả? CSV được config để coi toàn bộ nội dung file JSON như một single field/row, tránh split thành multi-rows. Sau đó, AS JSON parse thành structured data. Đây là best practice cho JSON single-object (không hỗ trợ JSONL/multi-object trực tiếp mà không có công cụ khác).

❌ Giải thích 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 text gốc tiếng Anh), dựa trên supported formats của OPENROWSET trong Synapse Serverless SQL pool (không thay đổi lớn đến 2026):

  • JSON ❌
    Sai vì: FORMAT='JSON' không được hỗ trợ trực tiếp trong OPENROWSET(BULK). Synapse chỉ parse JSON qua AS JSON sau khi đọc raw data (thường từ CSV trick). Dùng 'JSON' sẽ báo lỗi "Invalid format". Không phù hợp cho single record per rowset.

  • DELTA ❌
    Sai vì: DELTA là format Delta Lake (ACID tables trên Parquet), dùng cho Delta tables với schema phức tạp/multi-files. Không áp dụng cho JSON files đơn giản. OPENROWSET hỗ trợ DELTA cho query Delta tables, nhưng sẽ fail với JSON (lỗi schema mismatch), không tạo single JSON rowset.

  • PARQUET ❌
    Sai vì: PARQUET là format columnar/tabular (nested schema), dùng cho dữ liệu structured lớn. Với JSON files, sẽ lỗi "not a Parquet file" hoặc misread data. Không config được để output single JSON record per rowset; phù hợp cho analytics columnar hơn.

  • CSV ✅
    Đúng vì: Như giải thích trên, CSV với terminators 0x0b là cách chuẩn để đọc single JSON object per file, đảm bảo mỗi rowset = 1 JSON record. Hỗ trợ public Blob URL, ad-hoc queries hoàn hảo. (Xác nhận từ thực tế DP-203 exam).

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

Hy vọng phân tích này giúp bạn nắm vững Azure Synapse OPENROWSET! 🚀 Nếu cần demo code, hỏi thêm nhé.

Câu 184
Note: This question is part of a series of questions that present the same scenario. Each question in the series contains a unique solution that might meet the stated goals. Some question sets might have more than one correct solution, while others might not have a correct solution.
After you answer a question in this section, you will NOT be able to return to it. As a result, these questions will not appear in the review screen.
You plan to create an Azure Databricks workspace that has a tiered structure. The workspace will contain the following three workloads:
✑ A workload for data engineers who will use Python and SQL.
✑ A workload for jobs that will run notebooks that use Python, Scala, and SQL.
✑ A workload that data scientists will use to perform ad hoc analysis in Scala and R.
The enterprise architecture team at your company identifies the following standards for Databricks environments:
✑ The data engineers must share a cluster.
✑ The job cluster will be managed by using a request process whereby data scientists and data engineers provide packaged notebooks for deployment to the cluster.
✑ All the data scientists must be assigned their own cluster that terminates automatically after 120 minutes of inactivity. Currently, there are three data scientists.
You need to create the Databricks clusters for the workloads.
Solution: You create a Standard cluster for each data scientist, a High Concurrency cluster for the data engineers, and a Standard cluster for the jobs.
Does this meet the goal?
  1. A Yes
  2. B No
Xem giải thích

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

Câu hỏi thuộc dạng case study trong kỳ thi chứng chỉ Azure (thường gặp ở DP-203 hoặc AZ-305), mô tả một kịch bản triển khai Azure Databricks workspace với cấu trúc phân cấp cho ba workload chính:

  • Workload data engineers: Sử dụng Python và SQL, phải chia sẻ một cluster chung (shared cluster).
  • Workload jobs: Chạy notebooks bằng Python, Scala, SQL; cluster được quản lý qua quy trình request (data scientists và data engineers cung cấp notebooks đóng gói để deploy lên cluster này).
  • Workload data scientists: Phân tích ad-hoc bằng Scala và R; mỗi data scientist có cluster riêng (hiện có 3 người), tự động terminate sau 120 phút không hoạt động.

Mục tiêu (goal): Tạo các Databricks clusters phù hợp với các tiêu chuẩn trên.
Giải pháp đề xuất (Solution):

  • Tạo Standard cluster cho mỗi data scientist (tức 3 clusters).
  • Tạo High Concurrency cluster cho data engineers.
  • Tạo Standard cluster cho jobs.

Câu hỏi: Does this meet the goal? (Giải pháp này có đạt mục tiêu không?).
(Kiến thức dựa trên Azure Databricks phiên bản mới nhất 2024-2026: Cluster types bao gồm All-Purpose Compute với Standard - single user; High Concurrency - multi-user; Job Compute cho jobs. Auto-termination hỗ trợ trên All-Purpose clusters với idle timeout lên đến 120 phút hoặc hơn.)

✅ Đáp án đúng: Yes

Lý do lựa chọn 🛠️:
Giải pháp hoàn toàn khớp với yêu cầu:

  • Data engineers cần shared cluster → High Concurrency cluster lý tưởng cho multi-user interactive (hỗ trợ concurrency cao, tránh xung đột).
  • Data scientists (3 người) cần cluster riêng, auto-terminate → Standard cluster (single user) phù hợp cho ad-hoc analysis, dễ config idle timeout 120 phút.
  • Jobs cần cluster riêng, managed qua request → Standard cluster OK cho chạy notebooks jobs (không cần multi-user).
    Tất cả clusters đều là All-Purpose Compute, phù hợp interactive/jobs, và có thể scale theo nhu cầu. Không vi phạm tiêu chuẩn nào!

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

  • Yes ✅
    Đúng vì giải pháp khớp chính xác:

    • High Concurrency cluster cho data engineers đảm bảo shared access với nhiều user cùng lúc (multi-user mode, hỗ trợ Python/SQL interactive).
    • Standard cluster riêng cho mỗi data scientist (single user mode) phù hợp ad-hoc Scala/R, config auto-terminate sau 120 phút inactivity qua "Idle timeout" trong cluster config.
    • Standard cluster cho jobs hỗ trợ deploy packaged notebooks qua request process (chạy Python/Scala/SQL mà không cần concurrency cao).
      (Hoàn hảo cho tiered structure!)
  • No ❌
    Sai vì không có lý do nào để từ chối: Giải pháp không thiếu gì (như thiếu auto-terminate, sai cluster type), không thừa (như dùng High Concurrency cho jobs lãng phí), và tuân thủ đầy đủ standards (shared cho engineers, individual + auto-terminate cho scientists, dedicated cho jobs). Nếu chọn No, sẽ bỏ lỡ sự phù hợp của High Concurrency (multi-user) và Standard (single user/jobs).

📘 Tài liệu tham khảo

Câu 185
Note: This question is part of a series of questions that present the same scenario. Each question in the series contains a unique solution that might meet the stated goals. Some question sets might have more than one correct solution, while others might not have a correct solution.
After you answer a question in this section, you will NOT be able to return to it. As a result, these questions will not appear in the review screen.
You plan to create an Azure Databricks workspace that has a tiered structure. The workspace will contain the following three workloads:
✑ A workload for data engineers who will use Python and SQL.
✑ A workload for jobs that will run notebooks that use Python, Scala, and SQL.
✑ A workload that data scientists will use to perform ad hoc analysis in Scala and R.
The enterprise architecture team at your company identifies the following standards for Databricks environments:
✑ The data engineers must share a cluster.
✑ The job cluster will be managed by using a request process whereby data scientists and data engineers provide packaged notebooks for deployment to the cluster.
✑ All the data scientists must be assigned their own cluster that terminates automatically after 120 minutes of inactivity. Currently, there are three data scientists.
You need to create the Databricks clusters for the workloads.
Solution: You create a Standard cluster for each data scientist, a High Concurrency cluster for the data engineers, and a High Concurrency cluster for the jobs.
Does this meet the goal?
  1. A Yes
  2. B No
Xem giải thích

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

Câu hỏi này thuộc dạng case study trong kỳ thi chứng chỉ (có thể là DP-203: Data Engineering on Microsoft Azure), mô tả một kịch bản triển khai Azure Databricks workspace với cấu trúc phân tầng cho ba workload chính:

  • Workload cho data engineers: Sử dụng Python và SQL, phải chia sẻ một cluster duy nhất.
  • Workload cho jobs: Chạy notebooks bằng Python, Scala và SQL; cluster này được quản lý qua quy trình request, nơi data scientists và data engineers cung cấp notebooks đóng gói để deploy lên cluster.
  • Workload cho data scientists: Thực hiện phân tích ad-hoc bằng Scala và R; mỗi data scientist phải có cluster riêng (hiện có 3 người), và cluster tự động terminate sau 120 phút không hoạt động.

Tiêu chuẩn từ enterprise architecture team:

  • Data engineers chia sẻ cluster.
  • Job cluster quản lý qua request process.
  • Mỗi data scientist có cluster riêng, auto-terminate sau 120 phút idle.

Giải pháp đề xuất (Solution): Tạo Standard cluster riêng cho mỗi data scientist, High Concurrency cluster cho data engineers, và High Concurrency cluster cho jobs.

Câu hỏi: Giải pháp này có đạt mục tiêu (meet the goal) không?
📘 Nguồn tham khảo:

✅ Đáp án đúng: No

Lý do lựa chọn 🛠️:
Giải pháp KHÔNG đạt mục tiêu vì Standard cluster không hỗ trợ ngôn ngữ R mà data scientists cần sử dụng cho phân tích ad-hoc (Scala và R). Theo tài liệu Azure Databricks mới nhất (Databricks Runtime 14.x+ đến 2026), R kernel và table ACLs chỉ khả dụng trên High Concurrency clusters. Standard cluster chỉ hỗ trợ Python, Scala, SQL một cách đầy đủ, dẫn đến data scientists không thể chạy code R. Các phần còn lại (High Concurrency cho engineers và jobs) phù hợp, nhưng lỗi ở data scientists làm giải pháp thất bại toàn bộ.

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

  • Yes ❌
    Sai vì giải pháp không đáp ứng yêu cầu cho data scientists. Standard cluster (dù là Single User mode để assign riêng từng người và set auto-terminate 120 phút) không hỗ trợ R, trong khi workload yêu cầu Scala và R. High Concurrency mới cung cấp R kernel với concurrency tốt cho ad-hoc analysis. Nếu dùng Yes, sẽ vi phạm tiêu chuẩn hỗ trợ ngôn ngữ đầy đủ.

  • No ✅
    Đúng vì giải pháp thất bại ở điểm Standard cluster cho data scientists không hỗ trợ R (yêu cầu ad-hoc analysis Scala và R). Cần thay bằng High Concurrency cluster (Single User mode) cho từng data scientist để hỗ trợ R, kết hợp auto-terminate. High Concurrency cho engineers (shared, Python/SQL OK) và jobs (request process, multi-language OK) là phù hợp, nhưng lỗi chính quyết định toàn bộ solution không meet goal.

Khuyến nghị sửa chữa 🚀:

  • Data scientists: 3 High Concurrency clusters (Single User, auto-terminate 120 min).
  • Data engineers: High Concurrency (Shared mode).
  • Jobs: High Concurrency (Job cluster mode).
    📘 Xác nhận cập nhật 2026: Không thay đổi core (R exclusive High Concurrency), theo Databricks Runtime 15.x preview.
Câu 186
You are designing a folder structure for the files in an Azure Data Lake Storage Gen2 account. The account has one container that contains three years of data.
You need to recommend a folder structure that meets the following requirements:
✑ Supports partition elimination for queries by Azure Synapse Analytics serverless SQL pools
✑ Supports fast data retrieval for data from the current month
✑ Simplifies data security management by department
Which folder structure should you recommend?
  1. A \Department\DataSource\YYYY\MM\DataFile_YYYYMMDD.parquet
  2. B \DataSource\Department\YYYYMM\DataFile_YYYYMMDD.parquet
  3. C \DD\MM\YYYY\Department\DataSource\DataFile_DDMMYY.parquet
  4. D \YYYY\MM\DD\Department\DataSource\DataFile_YYYYMMDD.parquet
Xem giải thích

🧩 Phân tích chi tiết câu hỏi

Câu hỏi yêu cầu thiết kế cấu trúc thư mục (folder structure) cho dữ liệu lưu trữ trong Azure Data Lake Storage Gen2 (ADLS Gen2). Tài khoản có một container duy nhất chứa dữ liệu của ba năm. Cấu trúc phải đáp ứng ba yêu cầu chính:

  • Hỗ trợ partition elimination (loại bỏ phân vùng không cần thiết) cho các truy vấn từ Azure Synapse Analytics serverless SQL pools 🛠️: Nghĩa là khi query có điều kiện lọc theo năm/tháng (ví dụ: WHERE year = '2023' AND month = '12'), hệ thống chỉ scan thư mục liên quan, giảm thời gian và chi phí xử lý.
  • Hỗ trợ truy xuất dữ liệu nhanh cho tháng hiện tại ⚡: Dễ dàng truy cập và scan chỉ dữ liệu tháng gần nhất mà không phải duyệt toàn bộ dữ liệu ba năm.
  • Đơn giản hóa quản lý bảo mật dữ liệu theo bộ phận (department) 🔒: Cho phép áp dụng ACL (Access Control List) hoặc RBAC ở cấp thư mục cao nhất theo department, tránh phải set quyền chi tiết sâu.

📘 Lưu ý kiến thức cập nhật: Theo tài liệu Microsoft mới nhất (tính đến 2026, Azure Synapse Analytics hỗ trợ partition pruning tự động cho cấu trúc thư mục phân cấp như year=YYYY/month=MM/day=DD hoặc dạng thư mục thuần YYYY/MM/DD, ưu tiên thứ tự từ năm → tháng → ngày để tối ưu Hive-style partitioning. ADLS Gen2 kết hợp với Synapse serverless SQL pools sử dụng OPENROWSET hoặc external tables để tận dụng pruning dựa trên đường dẫn thư mục khớp với điều kiện WHERE).

Nguồn tham khảo:

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

Đáp án đúng: \Department\DataSource\YYYY\MM\DataFile_YYYYMMDD.parquet

Lý do 🏆:

  • Partition elimination: Cấu trúc YYYY/MM khớp hoàn hảo với pruning của Synapse serverless (query lọc year='2023' AND month='12' chỉ scan thư mục tương ứng) ✅.
  • Truy xuất nhanh tháng hiện tại: Thư mục YYYY/MM ở cấp cao (sau Department/DataSource), dễ mount hoặc truy cập trực tiếp tháng mới nhất mà không scan sâu ✅.
  • Quản lý bảo mật theo department: Department ở cấp đầu tiên, dễ set ACL/RBAC toàn bộ dữ liệu của một department (ví dụ: grant quyền cho UserGroup của Marketing chỉ trên /Marketing/...) ✅.
  • File DataFile_YYYYMMDD.parquet chuẩn hóa, hỗ trợ columnar storage tối ưu cho Synapse.

❌ 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), đánh dấu ✅/❌ dựa trên việc đáp ứng đầy đủ 3 yêu cầu:

  • \Department\DataSource\YYYY\MM\DataFile_YYYYMMDD.parquet
    ✅ Đúng hoàn toàn (như giải thích ở trên). Cấu trúc lý tưởng: department đầu → nguồn dữ liệu → phân vùng thời gian, cân bằng tất cả yêu cầu 🏅.

  • \DataSource\Department\YYYYMM\DataFile_YYYYMMDD.parquet
    ❌ Sai:

    • Partition elimination kém vì YYYYMM là thư mục phẳng (không tách riêng YYYY và MM), Synapse khó prune chính xác theo tháng/năm riêng lẻ 🧩.
    • Truy xuất tháng hiện tại vẫn ổn nhưng không tối ưu bằng thư mục riêng.
    • Bảo mật khó: Department ở cấp giữa, phải set ACL sâu hơn cho từng DataSource, phức tạp quản lý theo department 🔒.
  • \DD\MM\YYYY\Department\DataSource\DataFile_DDMMYY.parquet
    ❌ Sai nghiêm trọng:

    • Partition elimination không hiệu quả vì thứ tự DD/MM/YYYY ngược với chuẩn Hive/Synapse (nên từ năm → tháng → ngày), query theo năm/tháng phải scan toàn bộ DD/MM ❌.
    • Truy xuất tháng hiện tại chậm vì phải duyệt hết DD trước 🐌.
    • Bảo mật phức tạp nhất: Department ở cấp sâu (sau ngày/tháng), ACL phải áp dụng lồng ghép nhiều layer ❌.
    • File DDMMYY không chuẩn, dễ nhầm lẫn.
  • \YYYY\MM\DD\Department\DataSource\DataFile_YYYYMMDD.parquet
    ❌ Sai:

    • Partition elimination tốt cho query ngày/tháng/năm (thứ tự chuẩn YYYY/MM/DD) ✅, nhưng...
    • Truy xuất tháng hiện tại chậm hơn vì phải duyệt thêm DD bên trong MM 🐌.
    • Bảo mật kém: Department ở cấp sâu (sau thời gian), khó quản lý quyền theo department mà không ảnh hưởng dữ liệu khác, vi phạm yêu cầu đơn giản hóa 🔒.

Kết luận 🎯: Chỉ phương án đầu tiên cân bằng hoàn hảo 3 yêu cầu, phù hợp best practices Azure 2026! Nếu triển khai, khuyến nghị thêm prefix year=YYYY/month=MM/ để Synapse nhận diện tự động hơn 🚀.

Câu 187 Chọn nhiều đáp án
You have an Azure subscription that contains an Azure Synapse Analytics workspace named ws1 and an Azure Cosmos DB database account named Cosmos1. Cosmos1 contains a container named container1 and ws1 contains a serverless SQL pool.

You need to ensure that you can query the data in container1 by using the serverless SQL pool.

Which three actions should you perform? Each correct answer presents part of the solution.

NOTE: Each correct selection is worth one point.
  1. A Enable Azure Synapse Link for Cosmos1.
  2. B Disable the analytical store for container1.
  3. C In ws1, create a linked service that references Cosmos1.
  4. D Enable the analytical store for container1.
  5. E Disable indexing for container1.
Xem giải thích

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

Câu hỏi thuộc lĩnh vực Azure Synapse Analytics và Azure Cosmos DB, tập trung vào việc tích hợp dữ liệu để truy vấn. Cụ thể:

  • Bạn có một Azure subscription chứa Azure Synapse Analytics workspace tên ws1 (với serverless SQL pool) và Azure Cosmos DB account tên Cosmos1.
  • Cosmos1 có một container tên container1.
  • Mục tiêu: Đảm bảo có thể query dữ liệu từ container1 bằng serverless SQL pool trong ws1.
  • Đây là câu hỏi multiple correct answers (chọn 3 actions đúng), mỗi lựa chọn đúng trị giá 1 điểm.
  • Ngữ cảnh kỹ thuật (cập nhật đến 2026, theo Azure docs mới nhất): Để query Cosmos DB từ Synapse serverless SQL pool không ảnh hưởng đến transactional store (operational data), cần sử dụng Azure Synapse Link – một tính năng zero-ETL cho phép đồng bộ dữ liệu analytical store (dành cho phân tích) từ Cosmos DB sang Synapse. Quá trình yêu cầu kích hoạt analytical store trên container, kích hoạt Synapse Link trên account, và thiết lập kết nối từ Synapse workspace.

🔑 Lý do cần 3 actions này: Synapse Link tạo data pipeline tự động (continuous sync) từ analytical store của Cosmos DB đến Synapse, cho phép query trực tiếp qua T-SQL mà không cần ETL thủ công. Không kích hoạt đúng sẽ không thể truy cập dữ liệu analytical.

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

Các đáp án đúng là (3 lựa chọn):

  • A: Enable Azure Synapse Link for Cosmos1.
  • C: In ws1, create a linked service that references Cosmos1.
  • D: Enable the analytical store for container1.

Lý do chọn 🛠️:

  • Đây là bộ 3 bước bắt buộc theo quy trình chính thức của Microsoft (Azure Synapse Link for Azure Cosmos DB).
    1. Enable analytical store (D) trên container để lưu dữ liệu phân tích riêng biệt ( columnar storage, hỗ trợ HTAP - Hybrid Transactional/Analytical Processing).
    2. Enable Synapse Link (A) trên Cosmos DB account để kích hoạt pipeline đồng bộ.
    3. Create linked service (C) trong Synapse workspace để Synapse kết nối và query dữ liệu từ Cosmos DB analytical store qua serverless SQL pool (sử dụng external tables sau đó).
  • Nếu thiếu bất kỳ bước nào, query sẽ thất bại (lỗi kết nối hoặc không tìm thấy dữ liệu analytical).
  • Không cần code tùy chỉnh hay thay đổi indexing/transactional store.

📋 Giải thích chi tiết từng phương án (✅ Đúng / ❌ Sai)

Dưới đây là phân tích tất cả 5 lựa chọn, giữ nguyên văn bản gốc tiếng Anh. Mỗi giải thích dựa trên tài liệu Azure cập nhật 2024-2026 (Synapse Link v2.0+ hỗ trợ Cosmos DB for NoSQL).

  • ✅ Enable Azure Synapse Link for Cosmos1.
    Đúng vì: Đây là bước đầu tiên để kích hoạt Azure Synapse Link trên Cosmos DB account. Tính năng này tạo managed pipeline tự động sync dữ liệu từ analytical store sang Synapse workspace, cho phép query real-time qua serverless SQL pool. Không enable sẽ không có kết nối Synapse-Cosmos. (Bước 1 trong docs).

  • ❌ Disable the analytical store for container1.
    Sai vì: Analytical store phải được enable (không phải disable) để lưu dữ liệu phân tích. Disable sẽ xóa hoàn toàn analytical store, làm dữ liệu không thể sync sang Synapse. Đây là hành động ngược lại với yêu cầu.

  • ✅ In ws1, create a linked service that references Cosmos1.
    Đúng vì: Trong Synapse workspace ws1, linked service là kết nối dữ liệu (Azure Cosmos DB linked service) cần thiết để serverless SQL pool truy cập Cosmos1. Sau đó, tạo external data source và tables để query T-SQL trực tiếp. Đây là bước cuối trong setup Synapse Link.

  • ✅ Enable the analytical store for container1.
    Đúng vì: Container1 cần analytical store được enable để lưu dữ liệu dưới dạng columnar Parquet (optimized cho analytics). Dữ liệu transactional (operational) vẫn độc lập, và Synapse Link sẽ sync từ store này. Enable có chi phí lưu trữ thấp (~10% transactional data).

  • ❌ Disable indexing for container1.
    Sai vì: Indexing policy chỉ ảnh hưởng đến transactional queries (point reads/lookups) trong Cosmos DB, không liên quan đến analytical store. Synapse Link query analytical store độc lập, không dùng indexing của transactional store. Disable indexing chỉ giảm chi phí RU/s cho operational workload, không cần thiết và có thể hại transactional performance.

📘 Tài liệu tham khảo (Cập nhật mới nhất 2026)

🧠 Kết luận: Setup này cho phép zero-ETL analytics mượt mà, scale serverless! Nếu cần demo code hoặc troubleshooting, hỏi thêm nhé! 🚀

Câu 188 Chọn nhiều đáp án
You have an Azure subscription that contains an Azure Synapse Analytics dedicated SQL pool named Pool1. Pool1 receives new data once every 24 hours.
You have the following function.
create function dbo.udfFtoC(F decimal)
return decimal
as
begin
    return (F - 32) * 5.0 / 9
end

You have the following query.
select avg_date, sensorid, avg_f, dbo.udfFtoC(avg_temperature) as avg_c 
from SensorTemps 
where avg_date = @parameter

The query is executed once every 15 minutes and the @parameter value is set to the current date.
You need to minimize the time it takes for the query to return results.
Which two actions should you perform? Each correct answer presents part of the solution.
NOTE: Each correct selection is worth one point.
  1. A Create an index on the avg_f column.
  2. B Convert the avg_c column into a calculated column.
  3. C Create an index on the sensorid column.
  4. D Enable result set caching.
  5. E Change the table distribution to replicate.
Xem giải thích

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

Câu hỏi xoay quanh việc tối ưu hóa thời gian thực thi query trong Azure Synapse Analytics dedicated SQL pool (tên Pool1), nơi dữ liệu mới chỉ được cập nhật mỗi 24 giờ.

  • Bối cảnh dữ liệu: Bảng SensorTemps chứa các cột như avg_date, sensorid, avg_f, avg_temperature (có vẻ avg_temperature là giá trị nhiệt độ Fahrenheit cần chuyển sang Celsius).
  • User-Defined Function (UDF): dbo.udfFtoC(F decimal) là hàm scalar đơn giản chuyển đổi Fahrenheit sang Celsius: (F - 32) * 5.0 / 9.
  • Query chính:
    select avg_date, sensorid, avg_f, dbo.udfFtoC(avg_temperature) as avg_c 
    from SensorTemps 
    where avg_date = @parameter
    
    • Query này chạy mỗi 15 phút, với @parameter là ngày hiện tại.
    • Vấn đề chính: UDF scalar được gọi row-by-row (hàng một), gây chậm với dữ liệu lớn. Filter trên avg_date có thể hiệu quả nếu phân phối tốt, nhưng UDF làm bottleneck. Dữ liệu ít thay đổi (24h/lần) nên cần caching hoặc pre-compute.

Mục tiêu: Thực hiện hai hành động để giảm thiểu thời gian trả kết quả query. Đây là câu hỏi multi-select (mỗi lựa chọn đúng đáng 1 điểm).

📘 Kiến thức cập nhật (Azure Synapse Analytics 2024-2026): Dedicated SQL pool hỗ trợ Result Set Caching (RSC) từ version mới, computed columns (tính toán trước, có thể persist), và phân phối dữ liệu (hash/replicate). Scalar UDF vẫn chậm, khuyến nghị thay bằng computed column hoặc vectorized UDF (nhưng ở đây scalar đơn giản). Tài liệu: Azure Docs - Result Set Caching, Computed Columns.

✅ Đáp án đúng (hai lựa chọn)

Hai hành động cần thực hiện là:

  1. Convert the avg_c column into a calculated column.
  2. Enable result set caching.

Lý do lựa chọn:

  • Computed column: Thay vì gọi UDF mỗi lần query (chậm row-by-row), lưu avg_c như cột tính toán sẵn (PERSISTED nếu cần), query chỉ SELECT trực tiếp → giảm CPU đáng kể.
  • Result Set Caching (RSC): Cache toàn bộ kết quả query giống nhau (parameter ngày hiện tại, data ít thay đổi). Query chạy 15p/lần sẽ hit cache ngay, thời gian <1s thay vì full scan. RSC tự động expire khi data thay đổi (24h). Kết hợp hai cái: Pre-compute + Cache → tối ưu tối đa cho workload lặp lại. 🛠️

📋 Giải thích tất cả các phương án (đúng/sai)

  • ❌ Create an index on the avg_f column.
    Sai vì: Query không filter, sort hay join trên avg_f, chỉ SELECT nó. Index trên cột không dùng trong WHERE/clause sẽ không giúp, còn tốn storage/load time. Filter chính là avg_date → index/hash trên avg_date mới hữu ích (nhưng không có lựa chọn này).

  • ✅ Convert the avg_c column into a calculated column.
    Đúng vì: Hiện tại, dbo.udfFtoC(avg_temperature) gọi UDF scalar mỗi row → chậm (non-vectorized). Chuyển thành computed column avg_c AS (avg_temperature - 32) * 5.0 / 9 PERSISTED → tính trước khi insert/update, query SELECT trực tiếp → giảm 80-90% thời gian UDF. Phù hợp data update 24h/lần.

  • ❌ Create an index on the sensorid column.
    Sai vì: Query không filter/group trên sensorid, chỉ SELECT. Index không clustered/non-clustered trên cột SELECT-only vô ích, đặc biệt dedicated SQL pool ưu tiên hash distribution hơn index (index chỉ cho small tables hoặc CCI). Tốn tài nguyên không cần.

  • ✅ Enable result set caching.
    Đúng vì: RSC cache kết quả query identical (cùng SQL + parameter), TTL dựa metadata (data update 24h → cache valid lâu). Query 15p/lần → lần sau hit cache ngay (sub-second). Bật bằng ALTER DATABASE SCOPED CONFIGURATION SET RESULT_SET_CACHING ON. Hoàn hảo cho dashboard/reporting lặp.

  • ❌ Change the table distribution to replicate.
    Sai vì: Replicate copy full table mỗi node → tốt cho small table (<2GB) hoặc broadcast join, nhưng làm chậm data load (24h/update) và tốn storage (nhiều node). Query filter avg_date hiệu quả hơn với HASH(avg_date) (giả sử distribution hiện tại tốt), replicate không minimize SELECT time mà còn tăng overhead.

🧩 Tóm tắt lợi ích: Hai đáp án đúng giải quyết UDF bottleneck và lặp query, phù hợp best practices Synapse 2026. Test workload khuyến nghị dùng Query Store theo dõi! 🚀

Câu 189
You need to design a solution that will process streaming data from an Azure Event Hub and output the data to Azure Data Lake Storage. The solution must ensure that analysts can interactively query the streaming data.

What should you use?
  1. A Azure Stream Analytics and Azure Synapse notebooks
  2. B Structured Streaming in Azure Databricks
  3. C event triggers in Azure Data Factory
  4. D Azure Queue storage and read-access geo-redundant storage (RA-GRS)
Xem giải thích

🧩 Phân tích chi tiết câu hỏi trắc nghiệm

✅ Nội dung câu hỏi được giải thích rõ ràng:
Câu hỏi yêu cầu thiết kế một giải pháp xử lý dữ liệu streaming (dữ liệu dòng thời gian thực) từ Azure Event Hub (dịch vụ thu nhận và xử lý sự kiện lớn) và xuất dữ liệu ra Azure Data Lake Storage (ADLS - kho lưu trữ dữ liệu lớn hỗ trợ phân tích). Giải pháp phải đảm bảo các analyst (nhà phân tích) có thể truy vấn tương tác (interactively query) dữ liệu streaming này, nghĩa là họ cần công cụ cho phép khám phá, phân tích dữ liệu thời gian thực một cách linh hoạt, như qua notebooks hoặc giao diện tương tác, mà không chỉ dừng ở xử lý batch.
🛠️ Yêu cầu chính: Xử lý stream → Lưu trữ → Truy vấn tương tác. Đây là kịch bản phổ biến trong big data pipeline trên Azure, tập trung vào real-time analytics với khả năng scale và interactive querying.

📘 Đáp án đúng và lý do lựa chọn:
Đáp án đúng: Structured Streaming in Azure Databricks
✅ Lý do: Structured Streaming trong Azure Databricks (dựa trên Apache Spark) là công cụ lý tưởng cho streaming từ Event Hubs (qua connector chính thức), xử lý dữ liệu với fault-tolerance, xuất trực tiếp vào ADLS dưới dạng Delta Lake (hỗ trợ ACID transactions và time travel). Analysts có thể sử dụng Databricks notebooks để truy vấn tương tác ngay lập tức trên dữ liệu stream (qua SQL, Python, Scala), hỗ trợ real-time dashboard và ML. Đây là giải pháp end-to-end mạnh mẽ nhất cho yêu cầu, theo docs Azure cập nhật 2024-2026 (Databricks Runtime 14.x+ tích hợp Delta Live Tables cho streaming pipelines).
Nguồn tham khảo: Azure Databricks Structured Streaming docs & Event Hubs to Databricks connector.

🔍 Giải thích tất cả các phương án (đúng/sai)

  • Phương án 1: Azure Stream Analytics and Azure Synapse notebooks
    ❌ Sai vì: Azure Stream Analytics (ASA) giỏi xử lý stream từ Event Hubs và xuất ra ADLS, nhưng nó chỉ hỗ trợ truy vấn SQL đơn giản, không linh hoạt cho interactive querying phức tạp như joins động hoặc ML trên stream. Synapse notebooks có thể query dữ liệu đã lưu, nhưng không tích hợp native streaming end-to-end, dẫn đến độ trễ cao và thiếu scalability cho real-time interactive. Không phải best practice cho kịch bản này.

  • Phương án 2: Structured Streaming in Azure Databricks
    ✅ Đúng vì: Như đã giải thích ở trên, đây là lựa chọn tối ưu với full Spark streaming API, hỗ trợ đọc Event Hubs → xử lý → viết Delta Lake trên ADLS, và notebooks tương tác siêu mạnh (Live Queries, Auto Loader). Hỗ trợ cập nhật mới nhất như Photon engine cho tốc độ cao hơn (Databricks 2025+).

  • Phương án 3: event triggers in Azure Data Factory
    ❌ Sai vì: Azure Data Factory (ADF) dùng event triggers để kích hoạt pipeline khi có file/event mới (như từ Blob Storage), nhưng không xử lý streaming real-time từ Event Hubs. ADF thiên về ETL batch/orchestration, không hỗ trợ interactive query trên stream, chỉ copy dữ liệu tĩnh.

  • Phương án 4: Azure Queue storage and read-access geo-redundant storage (RA-GRS)
    ❌ Sai vì: Azure Queue Storage dùng cho message queuing đơn giản, không phải công cụ xử lý streaming từ Event Hubs (Event Hubs đã là message broker tốt hơn). RA-GRS chỉ là tùy chọn redundancy cho storage (geo-replication), không liên quan đến processing hoặc querying. Hoàn toàn không đáp ứng yêu cầu.

🛠️ Kết luận: Giải pháp Databricks là chuẩn Azure best practice cho streaming analytics interactive. Nếu triển khai, khuyến nghị dùng Delta Lake để tối ưu query performance!
Nguồn bổ sung: Azure Architecture Center - Streaming patterns.

Câu 190
You are creating an Apache Spark job in Azure Databricks that will ingest JSON-formatted data.

You need to convert a nested JSON string into a DataFrame that will contain multiple rows.

Which Spark SQL function should you use?
  1. A explode
  2. B filter
  3. C coalesce
  4. D extract
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ử lý dữ liệu JSON trong Azure Databricks sử dụng Apache Spark SQL. Cụ thể:

  • Bạn đang tạo một Apache Spark job để ingest (đọc vào) dữ liệu định dạng JSON.
  • Nhiệm vụ chính là chuyển đổi một chuỗi JSON lồng nhau (nested JSON string) – ví dụ như JSON chứa mảng hoặc struct bên trong – thành một DataFrame chứa nhiều hàng (multiple rows).
  • Mục tiêu là "phẳng hóa" (flatten) cấu trúc lồng nhau để mỗi phần tử con trở thành một hàng riêng biệt trong DataFrame, thay vì giữ nguyên dạng một hàng duy nhất.
    📘 Bối cảnh cập nhật đến 2026: Trong Spark 3.5+ (phiên bản mới nhất hỗ trợ trên Azure Databricks Runtime 15.x+), các hàm Spark SQL xử lý JSON nested vẫn giữ nguyên logic cốt lõi, với explode là lựa chọn chuẩn cho việc explode arrays/structs thành rows.

✅ Đáp án đúng: explode

Lý do lựa chọn:

  • Hàm explode là Spark SQL function chuyên dụng để mở rộng (explode) các mảng (arrays) hoặc struct lồng nhau trong JSON thành nhiều hàng riêng biệt trong DataFrame.
  • Ví dụ: Nếu JSON string có dạng {"items": [{"name": "A"}, {"name": "B"}] }, explode sẽ biến nó thành 2 rows thay vì 1 row duy nhất.
  • Đây là cách hiệu quả nhất để xử lý nested JSON, phù hợp với yêu cầu "contain multiple rows".
    🛠️ Cú pháp mẫu: explode(col("nested_array")) as flattened_col trong Spark SQL hoặc DataFrame API.

📋 Giải thích tất cả các phương án (đúng và sai)

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. Phần giải thích sử dụng tiếng Việt hoàn toàn:

  • ✅ explode
    Đúng vì: Hàm này chính xác dùng để explode nested arrays/structs trong JSON thành multiple rows, giúp DataFrame mở rộng dữ liệu lồng nhau một cách tự nhiên và hiệu suất cao. Không có hàm nào thay thế tốt hơn cho trường hợp này trong Spark SQL (Spark 3.5+).

  • ❌ filter
    Sai vì: Hàm filter chỉ dùng để lọc (filter) các hàng dựa trên điều kiện logic (predicate), không hề thay đổi cấu trúc nested JSON hay tạo thêm rows. Nó chỉ giảm số lượng rows hiện có, không phù hợp với việc convert nested string thành multiple rows.

  • ❌ coalesce
    Sai vì: Hàm coalesce dùng để giảm số lượng partition trong DataFrame (tối ưu hóa phân tán dữ liệu), không liên quan đến việc xử lý JSON nested hay tạo multiple rows từ string. Nó chỉ ảnh hưởng đến phân vùng, không flatten cấu trúc dữ liệu.

  • ❌ extract
    Sai vì: Hàm extract (hoặc get_json_object trong Spark) dùng để trích xuất (extract) giá trị từ một path cụ thể trong JSON, nhưng chỉ trả về giá trị đơn lẻ (single value) chứ không explode thành multiple rows. Nó giữ nguyên một hàng, không mở rộng nested data.

📚 Tài liệu tham khảo

🧮 Kết luận: Sử dụng explode để đảm bảo DataFrame có multiple rows từ nested JSON một cách chính xác và hiệu suất! Nếu cần code mẫu, hãy hỏi thêm nhé! 🚀