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

Tìm thấy 228 câu.

Câu 161
You have an Azure subscription that contains an Azure Synapse Analytics workspace named Workspace1, a Log Analytics workspace named Workspace2, and an Azure Data Lake Storage Gen2 container named Container1.

Workspace1 contains an Apache Spark job named Job1 that writes data to Container1. Workspace1 sends diagnostics to Workspace2.

From Synapse Studio, you submit Job1.

What should you use to review the LogQuery output of the job?
  1. A the files in the result subfolder of Container1
  2. B the Spark monitoring URL returned after Job1 is submitted
  3. C a table in Workspace2
  4. D the Apache Spark applications option on the Monitor tab
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 Synapse Analytics, một dịch vụ phân tích dữ liệu lớn của Microsoft Azure. Tình huống cụ thể:

  • Bạn có một Azure subscription chứa:
    • Workspace1: Không gian làm việc Azure Synapse Analytics.
    • Workspace2: Không gian làm việc Log Analytics (dùng để lưu trữ và phân tích logs).
    • Container1: Container lưu trữ Azure Data Lake Storage Gen2 (ADLS Gen2).
  • Trong Workspace1, có một Apache Spark job tên Job1 ghi dữ liệu vào Container1.
  • Workspace1 gửi diagnostics (dữ liệu chẩn đoán, logs hệ thống) đến Workspace2.
  • Bạn submit (gửi) Job1 từ Synapse Studio (giao diện web của Synapse).

Mục tiêu: Tìm cách review (xem xét) LogQuery output của job.

  • LogQuery output ở đây đề cập đến kết quả đầu ra của các truy vấn Spark SQL (Spark queries) trong job, bao gồm dữ liệu logs chi tiết, kết quả thực thi query được lưu dưới dạng file trong storage. Đây là tính năng chuẩn của Synapse Spark pools, nơi output được persist (lưu trữ bền vững) để phân tích sau.
  • Câu hỏi kiểm tra kiến thức về vị trí lưu trữ output cụ thể của Spark job trong Synapse, không phải monitoring thông thường.

(Kiến thức dựa trên tài liệu Azure Synapse cập nhật mới nhất đến năm 2026: Spark pools hỗ trợ output lưu trực tiếp vào ADLS Gen2 với cấu trúc folder chuẩn, không thay đổi lớn từ phiên bản 2023-2026. 📘 Nguồn: Azure Synapse Spark Job Output & Spark Pool Monitoring).

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

Đáp án đúng: the files in the result subfolder of Container1.

Lý do:
🛠️ Khi submit Spark job từ Synapse Studio, Synapse tự động tạo một folder con trong Container1 (liên kết với Spark pool) có tên tương ứng với job (ví dụ: Job1-<timestamp>). Bên trong đó là subfolder "result" chứa các file Parquet hoặc CSV đại diện cho LogQuery output (kết quả chi tiết của Spark queries). Đây là cách chuẩn để review output bền vững, có thể tải về hoặc query trực tiếp qua Synapse. Không cần tool khác, chỉ truy cập ADLS Gen2.
✅ Điều này đảm bảo tính nhất quán dữ liệu lớn, hỗ trợ replay và debug job.

📋 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:

  • ✅ the files in the result subfolder of Container1
    🛠️ Đúng như đã giải thích ở trên. Đây là vị trí lưu trữ chính thức cho LogQuery output của Spark job trong Synapse. Output được ghi trực tiếp vào ADLS Gen2 (Container1), dễ dàng truy cập qua Synapse Studio hoặc Azure Storage Explorer. Hoàn hảo cho phân tích sâu!

  • ❌ the Spark monitoring URL returned after Job1 is submitted
    🧩 Sai. Spark monitoring URL (liên kết Spark UI) chỉ cung cấp metrics thời gian thực như CPU, memory, stages thực thi – không chứa LogQuery output đầy đủ. URL này hết hạn sau khi job kết thúc, không dùng để review file output bền vững.

  • ❌ a table in Workspace2
    📘 Sai. Workspace2 (Log Analytics) nhận diagnostics logs hệ thống từ Synapse (như errors, warnings), lưu dưới dạng Kusto tables (ví dụ: SynapseLogs). Nhưng không chứa LogQuery output cụ thể của Spark job – chỉ là metadata chẩn đoán, không phải kết quả query chi tiết từ Container1.

  • ❌ the Apache Spark applications option on the Monitor tab
    🛠️ Sai. Tùy chọn Apache Spark applications trên tab Monitor trong Synapse Studio chỉ hiển thị overview monitoring (progress, failures, timelines) của các job Spark. Nó không lưu hoặc hiển thị LogQuery output dưới dạng file – chỉ là giao diện dashboard tạm thời, không thay thế cho files trong storage.

Kết luận tổng quát 🎯: Câu hỏi nhấn mạnh sự khác biệt giữa monitoring tạm thời (sai) và output lưu trữ bền vững (đúng) trong Azure Synapse Spark. Luôn kiểm tra ADLS Gen2 đầu tiên cho job outputs! (📘 Tham khảo thêm: Synapse Spark Diagnostics).

Câu 162
You have an Azure Synapse Analytics dedicated SQL pool named Pool1. Pool1 contains a table named table1.

You load 5 TB of data into table1.

You need to ensure that columnstore compression is maximized for table1.

Which statement should you execute?
  1. A DBCC INDEXDEFRAG (pool1, table1)
  2. B DBCC DBREINDEX (table1)
  3. C ALTER INDEX ALL on table1 REORGANIZE
  4. D ALTER INDEX ALL on table1 REBUILD
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 Synapse Analytics với một dedicated SQL pool có tên Pool1, chứa bảng table1. Bạn đã load 5 TB dữ liệu vào bảng này. Mục tiêu là tối đa hóa columnstore compression (nén dữ liệu cột) cho bảng table1.

📘 Giải thích ngữ cảnh:

  • Azure Synapse Analytics dedicated SQL pool sử dụng công nghệ columnstore indexes (chỉ mục cột) để lưu trữ và nén dữ liệu hiệu quả, đặc biệt với khối lượng lớn như 5 TB.
  • Columnstore compression hoạt động dựa trên các rowgroups và segments. Để đạt compression tối đa (lên đến 10x hoặc hơn), cần reorganize các segments và xây dựng lại index để sắp xếp dữ liệu tối ưu, giảm fragmentation và tăng độ đầy của rowgroups (mục tiêu 1 triệu rows/rowgroup).
  • Với dữ liệu lớn (5 TB), việc tối ưu hóa này rất quan trọng để giảm chi phí lưu trữ và tăng hiệu suất query.
  • Câu hỏi yêu cầu chọn T-SQL statement phù hợp để thực thi ngay lập tức.

🛠️ Kiến thức cập nhật (đến 2026): Theo tài liệu Microsoft Azure Synapse Analytics (phiên bản mới nhất Workspace và Runtime 2024+), REBUILD là lệnh chuẩn để max compression cho columnstore indexes trong dedicated SQL pools. Không có thay đổi lớn từ SQL Server 2019+ tích hợp vào Synapse.

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

Đáp án đúng: ALTER INDEX ALL on table1 REBUILD

Lý do (bằng tiếng Việt):

  • Lệnh REBUILD sẽ xây dựng lại toàn bộ columnstore indexes trên bảng table1, tái tổ chức dữ liệu thành các rowgroups tối ưu (1 triệu rows/rowgroup), loại bỏ fragmentation hoàn toàn và áp dụng maximum compression (nén dictionary + bitmap tối đa).
  • Với 5 TB dữ liệu, đây là cách hiệu quả nhất để đạt compression cao nhất, dù tốn tài nguyên (CPU/IO) hơn nhưng cần thiết cho dedicated SQL pool.
  • Microsoft khuyến nghị sử dụng sau khi load dữ liệu lớn để "crush" (tối ưu nén).

📋 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, giữ nguyên văn bản gốc tiếng Anh. Mỗi phương án được đánh giá với lý do chi tiết:

  • ❌ [SAI] DBCC INDEXDEFRAG (pool1, table1)
    Phân tích: Lệnh DBCC INDEXDEFRAG không tồn tại hoặc không áp dụng cho Synapse dedicated SQL pools (chỉ dùng trong SQL Server on-prem cho rowstore, không hỗ trợ columnstore). Nó cố gắng defrag index trên database pool1 và bảng table1, nhưng Synapse không hỗ trợ DBCC commands kiểu này cho pools. Không tối ưu compression mà chỉ defrag nhẹ (nếu có), không đạt max nén cho 5 TB dữ liệu. Sử dụng sẽ báo lỗi hoặc vô hiệu.

  • ❌ [SAI] DBCC DBREINDEX (table1)
    Phân tích: DBCC DBREINDEX là lệnh legacy (deprecated từ SQL Server 2005+), chỉ dùng cho rowstore indexes và không được hỗ trợ trong Azure Synapse dedicated SQL pools. Nó rebuild index nhưng không tối ưu columnstore compression (không tạo rowgroups mới hoặc max nén segments). Trong Synapse, lệnh này bị chặn hoặc không hiệu quả, dẫn đến lỗi syntax hoặc không cải thiện nén cho dữ liệu lớn.

  • ❌ [SAI] ALTER INDEX ALL on table1 REORGANIZE
    Phân tích: Lệnh REORGANIZE chỉ defagment nhẹ (compact segments nhỏ < 10k rows vào rowgroups lớn hơn), loại bỏ ghost records nhưng KHÔNG rebuild toàn bộ index. Nó đạt compression trung bình (~75-90%), không max (cần ~100% cho dictionary compression). Với 5 TB dữ liệu đã load (có thể fragmented), REORGANIZE không đủ mạnh, chỉ dùng cho maintenance định kỳ, không phải để "maximize" ngay lập tức.

  • ✅ [ĐÚNG] ALTER INDEX ALL on table1 REBUILD
    Phân tích: Như đã giải thích ở trên, REBUILD rebuild toàn bộ columnstore indexes, tạo rowgroups mới tối ưu, áp dụng full compression (delta store -> columnar store). Hoàn hảo cho dữ liệu lớn post-load, đạt max nén theo best practices Synapse. Có thể thêm WITH (DATA_COMPRESSION = COLUMNSTORE) để chỉ định, nhưng ALL đã bao quát.

📚 Tài liệu tham khảo

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

Câu 163
A company uses Azure Stream Analytics to monitor devices.
The company plans to double the number of devices that are monitored.
You need to monitor a Stream Analytics job to ensure that there are enough processing resources to handle the additional load.
Which metric should you monitor?
  1. A Early Input Events
  2. B Late Input Events
  3. C Watermark delay
  4. D Input Deserialization Errors
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 Stream Analytics – một dịch vụ xử lý dữ liệu thời gian thực của Microsoft Azure. Công ty đang sử dụng Azure Stream Analytics để giám sát các thiết bị (devices), và họ dự định gấp đôi số lượng thiết bị được giám sát, dẫn đến lượng dữ liệu đầu vào (input) tăng mạnh. Nhiệm vụ là giám sát công việc Stream Analytics (job) để đảm bảo có đủ tài nguyên xử lý (processing resources) như SU (Streaming Units) để xử lý tải thêm mà không bị nghẽn (backpressure) hoặc chậm trễ.

Cụ thể, chúng ta cần chọn metric phù hợp nhất từ Azure Monitor để phát hiện sớm vấn đề về dung lượng xử lý khi load tăng. Theo tài liệu Azure cập nhật mới nhất (tính đến 2026, phiên bản Azure Stream Analytics v2.0+), các metric này được theo dõi qua Azure Portal > Metrics hoặc Azure Monitor. Metric lý tưởng phải phản ánh trực tiếp tình trạng job có "theo kịp" input hay không dưới áp lực tải cao. 📊

✅ Đáp án đúng: Watermark delay

Lý do lựa chọn:
Watermark delay là metric cốt lõi để đo lường độ trễ giữa thời gian sự kiện thực tế (event time) và thời điểm watermark (mốc thời gian mà Stream Analytics sử dụng để xử lý windowing và output). Khi load tăng (như gấp đôi devices), nếu job thiếu tài nguyên, watermark sẽ bị chậm lại, dẫn đến Watermark delay tăng cao – dấu hiệu rõ ràng của backpressure hoặc bottleneck. Giám sát metric này giúp phát hiện sớm và scale SU kịp thời (tăng Streaming Units). Theo best practices Azure 2026, đây là metric chính cho performance tuning dưới high-throughput scenarios. 🛠️

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

  • Watermark delay ✅
    Đúng vì: Metric này trực tiếp phản ánh khả năng xử lý của job so với input volume. Giá trị cao (> vài giây) cho thấy job không theo kịp dữ liệu mới, đặc biệt khi scale devices gấp đôi. Sử dụng threshold alert (ví dụ: >5s) để tự động scale. Tài liệu: Azure Stream Analytics monitoring docs.

  • Early Input Events ❌
    Sai vì: Metric này đếm số sự kiện đến sớm hơn thời gian dự kiến (early arrivals), thường do clock skew giữa devices. Không liên quan đến tài nguyên xử lý tổng thể hay backpressure khi load tăng; chỉ phản ánh vấn đề đồng bộ thời gian, không phải resource shortage.

  • Late Input Events ❌
    Sai vì: Đếm sự kiện đến muộn hơn watermark (late arrivals), có thể bị drop hoặc out-of-order. Metric này hữu ích cho data quality, nhưng không phải chỉ báo chính cho resource capacity khi input volume tăng đột biến – vì late events có thể do network delay chứ không nhất thiết do job overload.

  • Input Deserialization Errors ❌
    Sai vì: Metric theo dõi lỗi phân tích cú pháp dữ liệu đầu vào (như JSON/AVRO malformed). Đây là vấn đề data format, không phản ánh resource processing power. Khi load tăng, lỗi này không tăng trừ khi data bị corrupt, không phù hợp để kiểm tra "enough processing resources".

📚 Tài liệu tham khảo chính thức (cập nhật 2026)

Phân tích này dựa trên kinh nghiệm Azure Data Engineer, giúp tối ưu job cho high-scale IoT monitoring! 🚀

Câu 164
You have an Azure subscription that contains an Azure Data Lake Storage Gen2 container named Container1 and an Azure Synapse Analytics workspace named Workspace1.

Workspace1 contains multiple Apache Spark jobs that reference a large dataset in Container1.

You need to optimize the run times of the jobs.

What should you do?
  1. A For Container1, disable hierarchical namespaces.
  2. B Cache the dataset.
  3. C Increase the spark.sql.autoBroadcastJoinThreshold value.
  4. D Use Resilient Distributed Datasets (RDDs).
Xem giải thích

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

Câu hỏi tập trung vào việc tối ưu hóa thời gian chạy (run times) của các Apache Spark jobs trong Azure Synapse Analytics workspace (Workspace1). Cụ thể:

  • Bạn có một Azure subscription chứa Azure Data Lake Storage Gen2 (ADLS Gen2) container tên Container1.
  • Workspace1 chứa nhiều Spark jobs tham chiếu đến một dataset lớn lưu trữ trong Container1.
  • Vấn đề chính: Các Spark jobs cần đọc dữ liệu lớn từ ADLS Gen2 nhiều lần, dẫn đến thời gian chạy lâu do I/O bottleneck từ storage.
  • Mục tiêu: Tối ưu hóa để giảm thời gian thực thi, tận dụng các tính năng của Spark trong Synapse Analytics (dựa trên phiên bản mới nhất Azure Synapse đến năm 2026, hỗ trợ Spark 3.4+ với tích hợp Delta Lake và caching nâng cao).

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

✅ Đáp án đúng: Cache the dataset

Lý do lựa chọn:

  • Trong Apache Spark trên Azure Synapse, caching dataset (sử dụng df.cache() hoặc df.persist()) sẽ lưu dữ liệu vào memory (hoặc disk nếu cần) sau lần đọc đầu tiên từ ADLS Gen2.
  • Dataset lớn được đọc lặp lại nhiều lần trong các jobs → Caching giúp giảm đáng kể I/O từ storage, tăng tốc độ lên đến 10x cho các phép tính lặp (như joins, aggregations).
  • Đây là best practice hàng đầu cho workload đọc-heavy từ external storage như ADLS Gen2, phù hợp với kiến trúc serverless Spark pools trong Synapse (tối ưu hóa tự động dựa trên executor memory).
  • 🛠️ Cách triển khai: spark.read.parquet("abfss://Container1@account.dfs.core.windows.net/path").cache().

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

  • ❌ For Container1, disable hierarchical namespaces.
    Sai vì: Hierarchical Namespace (HNS) trong ADLS Gen2 bắt buộc enable để đạt performance tối ưu với Spark (hỗ trợ atomic operations, nhanh directory listings và metadata). Disable HNS sẽ làm giảm performance (fallback sang blob namespace chậm hơn 50-70% cho large datasets), không optimize mà còn tệ hơn. Synapse khuyến cáo luôn enable HNS cho analytics workloads (từ 2023+).

  • ✅ Cache the dataset.
    Đúng vì: Như giải thích trên, caching giữ dữ liệu in-memory sau lần đọc đầu, trực tiếp giải quyết bottleneck I/O từ dataset lớn. Hiệu quả cao nhất cho iterative Spark jobs trong Synapse, tự động spill-to-disk nếu memory不足 (Spark 3.4+ cải tiến storage-level LRU).

  • ❌ Increase the spark.sql.autoBroadcastJoinThreshold value.
    Sai vì: Giá trị mặc định là 10MB, tăng sẽ cho phép broadcast tables lớn hơn trong joins (gửi toàn bộ table nhỏ sang tất cả executors). Tuy nhiên, với dataset lớn từ ADLS Gen2, điều này có thể gây OutOfMemoryError (OOM) hoặc tăng shuffle overhead, không optimize đọc data mà chỉ ảnh hưởng join strategy. Không phù hợp cho vấn đề chính (đọc lặp dataset lớn).

  • ❌ Use Resilient Distributed Datasets (RDDs).
    Sai vì: RDDs là API low-level của Spark, không có Catalyst Optimizer như DataFrames/Datasets → performance kém hơn 2-5x cho large datasets (không auto vectorization, predicate pushdown). Synapse khuyến cáo sử dụng DataFrames với Delta format cho ADLS Gen2 để tận dụng optimizations (từ Spark 3.x+).

🛠️ Khuyến nghị bổ sung: Kết hợp caching với Delta Lake (enable trên Container1) để thêm Z-ordering/indexing, và scale Spark pool lên Large/Extra Large instances cho memory cao hơn. Test với Synapse Studio monitoring để đo latency giảm.

Câu 165 Chọn nhiều đáp án
You have an Azure Synapse Analytics dedicated SQL pool named pool1.

You plan to implement a star schema in pool and create a new table named DimCustomer by using the following code.

CREATE TABLE dbo.[DimCustomer](
    [CustomerKey] int NOT NULL,
    [CustomerSourceID] [int] NOT NULL,
    [Title] [nvarchar](8) NULL,
    [FirstName] [nvarchar](50) NOT NULL,
    [MiddleName] [nvarchar](50) NULL,
    [LastName] [nvarchar](50) NOT NULL,
    [Suffix] [nvarchar](10) NULL,
    [CompanyName] [nvarchar](128) NULL,
    [SalesPerson] [nvarchar](256) NULL,
    [EmailAddress] [nvarchar](50) NULL,
    [Phone] [nvarchar](25) NULL,
    [InsertedDate] [datetime] NOT NULL,
    [ModifiedDate] [datetime] NOT NULL,
    [HashKey] [varchar](100) NOT NULL,
    [IsCurrentRow] [bit] NOT NULL
) 
WITH 
(
    DISTRIBUTION = REPLICATE,
    CLUSTERED COLUMNSTORE INDEX
);
GO


You need to ensure that DimCustomer has the necessary columns to support a Type 2 slowly changing dimension (SCD).

Which two columns should you add? Each correct answer presents part of the solution.

NOTE: Each correct selection is worth one point.
  1. A [HistoricalSalesPerson] [nvarchar] (256) NOT NULL
  2. B [EffectiveEndDate] [datetime] NOT NULL
  3. C [PreviousModifiedDate] [datetime] NOT NULL
  4. D [RowID] [bigint] NOT NULL
  5. E [EffectiveStartDate] [datetime] NOT NULL
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 (dedicated SQL pool), liên quan đến việc thiết kế star schema trong data warehouse. Cụ thể:

  • Bạn có một dedicated SQL pool tên pool1 và đang tạo bảng dimension tên DimCustomer bằng mã SQL đã cho.
  • Bảng này sử dụng DISTRIBUTION = REPLICATE (phù hợp cho dimension nhỏ, tránh shuffle khi join) và CLUSTERED COLUMNSTORE INDEX (tối ưu lưu trữ và query columnar).
  • Bảng đã có các cột cơ bản: CustomerKey (surrogate key), CustomerSourceID (business/natural key), các trường thông tin khách hàng (tên, email, phone,...), InsertedDate, ModifiedDate, HashKey (dùng cho slowly changing dimension - SCD hoặc CDC), và IsCurrentRow (flag đánh dấu hàng hiện tại).
  • Yêu cầu chính: Thêm hai cột cần thiết để hỗ trợ Type 2 Slowly Changing Dimension (SCD Type 2).
    • SCD Type 2 là kỹ thuật lưu trữ toàn bộ lịch sử thay đổi của dimension bằng cách tạo hàng mới cho mỗi thay đổi, sử dụng effective dates (ngày bắt đầu và kết thúc hiệu lực) và flag current để phân biệt phiên bản hiện tại/lịch sử. Điều này rất phổ biến trong data warehouse để hỗ trợ báo cáo lịch sử chính xác (ví dụ: khách hàng thay đổi địa chỉ, giữ lại lịch sử cũ).
  • Lưu ý: Đây là câu hỏi multi-select (chọn 2 đáp án đúng, mỗi cái 1 điểm). Phiên bản Azure Synapse Analytics cập nhật đến 2026 vẫn giữ nguyên pattern SCD Type 2 chuẩn từ SQL Server/Data Warehouse (không thay đổi lớn về thiết kế cột).

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

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

Hai cột cần thêm là:

  • [EffectiveEndDate] [datetime] NOT NULL
  • [EffectiveStartDate] [datetime] NOT NULL

Lý do 🛠️:

  • Trong SCD Type 2, cần hai cột effective date để đánh dấu khoảng thời gian hiệu lực của mỗi phiên bản dữ liệu:
    • EffectiveStartDate: Ngày bắt đầu hiệu lực của phiên bản (thường = ModifiedDate hoặc InsertedDate khi tạo hàng mới).
    • EffectiveEndDate: Ngày kết thúc hiệu lực (thường = '9999-12-31' cho current row, hoặc ngày thay đổi khi tạo phiên bản mới).
  • Bảng đã có IsCurrentRow (flag bit: 1 = current, 0 = historical), HashKey (để detect thay đổi), nhưng thiếu effective dates để query chính xác theo thời gian (ví dụ: WHERE @queryDate BETWEEN EffectiveStartDate AND EffectiveEndDate). Không có chúng, không thể hỗ trợ đầy đủ SCD Type 2.

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

Dưới đây là phân tích từng phương án một, giữ nguyên văn bản gốc tiếng Anh. Mỗi cái được đánh giá dựa trên yêu cầu SCD Type 2 chuẩn:

  • ❌ [SAI] [HistoricalSalesPerson] [nvarchar] (256) NOT NULL
    Giải thích: Cột này chỉ lưu lịch sử một trường cụ thể (SalesPerson), không phải pattern chuẩn SCD Type 2. SCD Type 2 lưu toàn bộ row lịch sử qua surrogate key + effective dates, không cần cột riêng cho từng trường. Thêm cột này làm bảng phức tạp, dư thừa (bảng đã có SalesPerson).

  • ✅ [ĐÚNG] [EffectiveEndDate] [datetime] NOT NULL
    Giải thích: Cột cần thiết cho SCD Type 2. Đánh dấu ngày kết thúc hiệu lực của phiên bản (ví dụ: NULL hoặc '9999-12-31' cho current row). Kết hợp với EffectiveStartDate và IsCurrentRow, giúp query historical data chính xác (ví dụ: báo cáo doanh số theo salesperson cũ).

  • ❌ [SAI] [PreviousModifiedDate] [datetime] NOT NULL
    Giải thích: Không chuẩn cho SCD Type 2. Bảng đã có ModifiedDate (ngày sửa đổi gần nhất). Cột này chỉ lưu giá trị trước đó, không định nghĩa khoảng thời gian hiệu lực đầy đủ như effective dates. SCD Type 2 ưu tiên effective range thay vì chain các modified date.

  • ❌ [SAI] [RowID] [bigint] NOT NULL
    Giải thích: RowID là surrogate key kiểu identity/sequence, nhưng bảng đã có CustomerKey (int NOT NULL - thường dùng làm surrogate key cho SCD). Thêm RowID gây dư thừa, không liên quan trực tiếp đến SCD Type 2 (chỉ cần surrogate + natural key + effective dates).

  • ✅ [ĐÚNG] [EffectiveStartDate] [datetime] NOT NULL
    Giải thích: Cột cần thiết cho SCD Type 2. Đánh dấu ngày bắt đầu hiệu lực của phiên bản (ví dụ: khi insert row mới do thay đổi). Là phần bắt buộc để track timeline, hỗ trợ query temporal như AS OF trong Synapse (tính năng system-versioned tables tương tự).

🧩 Tóm tắt lợi ích: Với hai cột ✅ này, bảng DimCustomer đầy đủ SCD Type 2, hỗ trợ merge/update từ staging table (sử dụng MERGE SQL với HashKey detect change). Điều này tối ưu cho star schema join với fact tables trong Synapse dedicated pool! 🚀

Câu 166 Chọn nhiều đáp án
You have an Azure Stream Analytics job.
You need to ensure that the job has enough streaming units provisioned.
You configure monitoring of the SU % Utilization metric.
Which two additional metrics should you monitor? Each correct answer presents part of the solution.
NOTE: Each correct selection is worth one point.
  1. A Backlogged Input Events
  2. B Watermark Delay
  3. C Function Events
  4. D Out of order Events
  5. E Late Input Events
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 chủ đề Azure Stream Analytics (một dịch vụ xử lý dữ liệu thời gian thực trên Microsoft Azure). Nội dung chính:
Bạn đang chạy một Azure Stream Analytics job (công việc xử lý luồng dữ liệu). Để đảm bảo job có đủ streaming units (SU) được provisioned (cung cấp tài nguyên tính toán), bạn đã cấu hình giám sát metric SU % Utilization (phần trăm sử dụng SU).
Yêu cầu bổ sung: Cần monitor thêm hai metrics khác để đánh giá chính xác tình trạng SU. Đây là câu hỏi multiple correct answers (mỗi đáp án đúng worth 1 point).

Mục tiêu: Các metrics này giúp phát hiện tình trạng backlog (tích tụ dữ liệu đầu vào không xử lý kịp) hoặc độ trễ xử lý, từ đó quyết định scale up SU (tăng tài nguyên). Theo tài liệu Azure cập nhật đến 2024-2026 (Azure Stream Analytics v2.x với cải tiến monitoring), SU % Utilization chỉ cho biết tải hiện tại, nhưng cần kết hợp metrics khác để tránh under-provisioning.

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

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

Hai metrics cần monitor thêm là:

  • Backlogged Input Events ✅
  • Watermark Delay ✅

Lý do lựa chọn:
🛠️ Backlogged Input Events đo lường số lượng sự kiện đầu vào bị tích tụ (backlog) vì job không xử lý kịp do thiếu SU. Nếu metric này tăng cao (>0 liên tục), cần scale up SU ngay để tránh mất dữ liệu.
🛠️ Watermark Delay đo độ trễ watermark (thời gian chờ dữ liệu cũ nhất để xử lý windowing). Giá trị cao (> vài giây) cho thấy job chậm, cần thêm SU để giảm latency.
Kết hợp với SU % Utilization (>80% là cảnh báo), bộ ba metrics này là tiêu chuẩn chính thức của Microsoft để provision SU tối ưu (theo best practices 2024-2026).

📊 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, giữ nguyên văn bản gốc bằng tiếng Anh, kèm lý do đúng/sai bằng tiếng Việt:

  • Backlogged Input Events ✅ ĐÚNG
    🟢 Metric này theo dõi số sự kiện đầu vào bị backlog. Nếu >0, job thiếu SU → scale up. Đây là metric cốt lõi để đảm bảo provisioning đủ (Azure docs khuyến nghị monitor 24/7).

  • Watermark Delay ✅ ĐÚNG
    🟢 Đo độ trễ giữa watermark hiện tại và thời gian hệ thống. Giá trị cao (>5-10s) chỉ ra bottleneck xử lý → cần tăng SU. Phù hợp hoàn hảo với ngữ cảnh câu hỏi.

  • Function Events ❌ SAI
    🔴 Metric này đếm số lần gọi User-Defined Functions (UDF) hoặc custom functions. Không liên quan trực tiếp đến SU provisioning, chỉ dùng để debug lỗi function, không phải scale job.

  • Out of order Events ❌ SAI
    🔴 Theo dõi sự kiện đến không theo thứ tự thời gian (out-of-order). Dùng để kiểm tra chất lượng dữ liệu đầu vào, không phải metric đánh giá SU utilization hay backlog.

  • Late Input Events ❌ SAI
    🔴 Đếm sự kiện đầu vào trễ hạn (late events so với watermark). Dùng cho phân tích dữ liệu muộn, nhưng không trực tiếp chỉ ra thiếu SU (có thể do nguồn dữ liệu chậm, không phải job).

🏆 Kết luận và lời khuyên thực tế

Để job Azure Stream Analytics chạy mượt mà đến 2026:

  • Thiết lập alerts trên bộ ba metrics: SU % >80%, Backlogged >0, Watermark Delay >5s.
  • Sử dụng Azure Monitor hoặc Application Insights để visualize.
  • Scale tự động qua Autoscale (preview 2024) nếu workload biến động.
    Nếu cần code mẫu hoặc demo, hãy hỏi thêm nhé! 🚀
Câu 167
You have an Azure subscription that contains an Azure Data Lake Storage Gen2 account named account1 and an Azure Synapse Analytics workspace named workspace1.

You need to create an external table in a serverless SQL pool in workspace1. The external table will reference CSV files stored in account1. The solution must maximize performance.

How should you configure the external table?
  1. A Use a native external table and authenticate by using a shared access signature (SAS).
  2. B Use a native external table and authenticate by using a storage account key.
  3. C Use an Apache Hadoop external table and authenticate by using a shared access signature (SAS).
  4. D Use an Apache Hadoop external table and authenticate by using a service principal in Microsoft Azure Active Directory (Azure AD), part of Microsoft Entra.
Xem giải thích

🧩 Giải thích nội dung câu hỏi

Câu hỏi tập trung vào việc tạo một external table trong serverless SQL pool của Azure Synapse Analytics workspace (tên workspace1), tham chiếu đến các file CSV lưu trữ trong Azure Data Lake Storage Gen2 (ADLS Gen2) account (tên account1). Mục tiêu chính là tối ưu hóa hiệu suất (maximize performance).

  • External table là bảng ảo cho phép truy vấn dữ liệu bên ngoài (như file CSV trong ADLS Gen2) mà không cần di chuyển dữ liệu vào Synapse.
  • Serverless SQL pool trong Synapse là chế độ on-demand, không cần quản lý cluster, phù hợp cho truy vấn ad-hoc.
  • Yêu cầu performance cao: Cần chọn loại external table và phương thức xác thực (authentication) giúp truy vấn nhanh nhất, giảm độ trễ và chi phí compute.
  • Bối cảnh Azure: Sử dụng kiến thức cập nhật mới nhất từ Microsoft (tính đến 2026), Synapse serverless hỗ trợ hai loại external table chính: native external table (tối ưu hóa cao, không qua Hadoop) và Apache Hadoop external table (qua PolyBase, chậm hơn).

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

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

Đáp án đúng: Use a native external table and authenticate by using a shared access signature (SAS).

Lý do 🛠️:

  • Native external table trong serverless SQL pool được thiết kế đặc biệt để tối ưu performance cao nhất, hỗ trợ trực tiếp định dạng CSV/Parquet mà không qua lớp trung gian Hadoop/PolyBase. Nó sử dụng cơ chế native reader của Synapse, giảm đáng kể thời gian scan dữ liệu (có thể nhanh gấp 5-10 lần so với Hadoop external table).
  • Xác thực bằng SAS (Shared Access Signature): Đây là phương thức được khuyến nghị chính thức cho native external table trên ADLS Gen2 trong serverless pool. SAS token cho phép truy cập granular (read-only), an toàn, không cần key toàn cục, và tích hợp mượt mà với LOCATION clause trong câu lệnh CREATE EXTERNAL TABLE. Không hỗ trợ storage account key cho native type, giúp tránh rủi ro bảo mật và tăng tốc độ auth.
  • Kết quả: Giải pháp này đáp ứng đầy đủ "maximize performance" theo docs Microsoft mới nhất (2026), phù hợp cho workload lớn với CSV files.

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

Dưới đây là phân tích chi tiết từng lựa chọn, giữ nguyên văn bản gốc tiếng Anh:

  • ✅ Use a native external table and authenticate by using a shared access signature (SAS).
    Đúng 🏆: Như đã giải thích ở trên, đây là kết hợp tối ưu nhất cho performance trong serverless SQL pool. Native table bypass Hadoop, SAS auth nhanh và an toàn. Ví dụ syntax: CREATE EXTERNAL TABLE ... WITH (LOCATION = 'https://account1.dfs.core.windows.net/container/path?sv=...&ss=...').

  • ❌ Use a native external table and authenticate by using a storage account key.
    Sai 🚫: Native external table không hỗ trợ storage account key trong serverless SQL pool (lỗi khi tạo table). Storage key chỉ dùng cho Hadoop external table. Dùng key sẽ làm giảm performance do auth kém tối ưu và rủi ro bảo mật cao (key toàn quyền).

  • ❌ Use an Apache Hadoop external table and authenticate by using a shared access signature (SAS).
    Sai ⚠️: Apache Hadoop external table (dùng PolyBase) chậm hơn đáng kể so với native (scan qua TPD engine, overhead cao với CSV). Dù SAS auth được hỗ trợ, nhưng loại table này không "maximize performance" – Microsoft khuyến cáo tránh cho workload lớn, chỉ dùng legacy cases.

  • ❌ Use an Apache Hadoop external table and authenticate by using a service principal in Microsoft Azure Active Directory (Azure AD), part of Microsoft Entra.
    Sai 🔒: Tương tự trên, Hadoop external table kém performance (qua PolyBase, không native). Service principal (qua Azure AD/Entra ID) hỗ trợ auth tốt cho bảo mật enterprise, nhưng vẫn chậm và không phải lựa chọn tối ưu. Microsoft ưu tiên Managed Identity hoặc SAS cho native tables thay vì cách này.

Kết luận 🎯: Luôn ưu tiên native external table + SAS cho Synapse serverless với ADLS Gen2 để đạt performance đỉnh cao! Nếu cần code mẫu, tham khảo docs Microsoft.

Câu 168
You have an activity in an Azure Data Factory pipeline. The activity calls a stored procedure in a data warehouse in Azure Synapse Analytics and runs daily.
You need to verify the duration of the activity when it ran last.
What should you use?
  1. A activity runs in Azure Monitor
  2. B Activity log in Azure Synapse Analytics
  3. C the sys.dm_pdw_wait_stats data management view in Azure Synapse Analytics
  4. D an Azure Resource Manager template
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ể:

  • Có một activity (hoạt động) trong pipeline ADF, activity này gọi stored procedure trong data warehouse của Azure Synapse Analytics (dịch vụ phân tích dữ liệu lớn trên Azure).
  • Pipeline chạy hàng ngày (daily).
  • Yêu cầu: Xác minh thời lượng (duration) của activity khi nó chạy lần cuối cùng (last run). 📌 Mục tiêu chính: Tìm công cụ/phương pháp phù hợp để kiểm tra thời gian thực thi của activity cụ thể trong ADF, không phải toàn bộ pipeline hay tài nguyên khác. Điều này đòi hỏi tính năng monitoring chi tiết ở mức activity level trong ADF (phiên bản cập nhật mới nhất đến 2026 vẫn giữ nguyên cơ chế monitor qua Azure Monitor integration).

✅ Đáp án đúng: activity runs in Azure Monitor

Lý do lựa chọn:

  • Trong ADF (cập nhật đến 2026), bạn có thể theo dõi activity runs chi tiết qua Azure Monitor, bao gồm duration, start time, end time, status, và lỗi của từng activity trong pipeline.
  • Cách thực hiện: Vào ADF Studio > Monitor > Chọn pipeline run gần nhất > Tab Activity runs (tích hợp Azure Monitor metrics/logs). Hoặc query trực tiếp trong Azure Monitor Logs (Log Analytics workspace liên kết với ADF) bằng Kusto Query Language (KQL) như AzureDiagnostics | where Category == "ActivityRuns".
  • Đây là cách chính thức và nhanh nhất để verify duration của last run, hỗ trợ real-time và historical data lên đến 90 ngày (hoặc lâu hơn với retention policy).
  • 🛠️ Ưu điểm: Tích hợp tự động, không cần code thêm, phù hợp cho daily runs.

📋 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, dựa trên tài liệu AWS/Azure cập nhật (lưu ý: câu hỏi thuộc Azure, không AWS). Tôi giữ nguyên văn bản gốc tiếng Anh của phương án, chỉ giải thích hoàn toàn bằng tiếng Việt.

  • ✅ activity runs in Azure Monitor
    Đúng vì: Như giải thích trên, đây là tính năng cốt lõi của ADF monitoring. Azure Monitor thu thập logs/metrics từ activity runs, cho phép xem duration chính xác (ví dụ: "Duration: 00:05:23"). Hỗ trợ filter theo pipeline/activity name và thời gian last run. (🛠️ Phù hợp nhất cho kịch bản daily pipeline).

  • ❌ Activity log in Azure Synapse Analytics
    Sai vì: Activity log trong Synapse Analytics chỉ ghi lại các hoạt động quản trị (admin actions) như create/delete resource, scale pool, không phải execution details của stored procedure từ ADF. Không cung cấp duration của activity ADF gọi SP. (📘 Chỉ dùng cho audit Synapse workspace, không liên kết trực tiếp với ADF runs).

  • ❌ the sys.dm_pdw_wait_stats data management view in Azure Synapse Analytics
    Sai vì: Đây là DMV (Dynamic Management View) trong Synapse dành cho query performance và wait stats của SQL queries/SP executions bên trong data warehouse (PDW engine). Nó cho wait time theo session/query, nhưng không phải duration của ADF activity (activity là wrapper gọi SP, không expose ở DMV này). Không phù hợp để track last run từ ADF perspective. (🧩 Chỉ dùng troubleshooting query chậm trong Synapse, không monitor ADF).

  • ❌ an Azure Resource Manager template
    Sai vì: ARM template là IaC (Infrastructure as Code) để deploy/provision tài nguyên Azure (như ADF pipeline, Synapse pool). Nó không dùng để monitor hay query runtime data như duration của activity runs. Chỉ định nghĩa cấu hình, không có execution history. (🚫 Hoàn toàn không liên quan đến verification last run).

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

Hy vọng phân tích này giúp bạn nắm vững! Nếu cần demo thực tế, hãy cho biết thêm chi tiết pipeline. 🚀

Câu 169
You have an Azure Data Factory pipeline that is triggered hourly.
The pipeline has had 100% success for the past seven days.
The pipeline execution fails, and two retries that occur 15 minutes apart also fail. The third failure returns the following error.
ErrorCode=UserErrorFileNotFound,'Type=Microsoft.DataTransfer.Common.Shared.HybridDeliveryException,Message=ADLS Gen2 operation failed for: Operation returned an invalid status code 'NotFound'. Account: 'contosoproduksouth'. Filesystem: wwi. Path: 'BIKES/CARBON/year=2021/month=01/day=10/hour=06'. ErrorCode: 'PathNotFound'. Message: 'The specified path does not exist.'. RequestId: '6d269b78-901f-001b-4924-e7a7bc000000'. TimeStamp: 'Sun, 10 Jan 2021 07:45:05
What is a possible cause of the error?
  1. A The parameter used to generate year=2021/month=01/day=10/hour=06 was incorrect.
  2. B From 06:00 to 07:00 on January 10, 2021, there was no data in wwi/BIKES/CARBON.
  3. C From 06:00 to 07:00 on January 10, 2021, the file format of data in wwi/BIKES/CARBON was incorrect.
  4. D The pipeline was triggered too early.
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 pipeline trong Azure Data Factory (ADF) được kích hoạt hàng giờ (hourly), đã chạy thành công 100% trong 7 ngày qua. Tuy nhiên, lần chạy mới nhất thất bại, kèm theo hai lần retry cách nhau 15 phút cũng thất bại. Lỗi cụ thể là UserErrorFileNotFound từ hoạt động ADLS Gen2 (Azure Data Lake Storage Gen2), với thông báo chi tiết:

  • Tài khoản: contosoproduksouth
  • Filesystem: wwi
  • Đường dẫn: BIKES/CARBON/year=2021/month=01/day=10/hour=06
  • Lỗi gốc: PathNotFound – "The specified path does not exist."

Thời gian lỗi: Timestamp là Sun, 10 Jan 2021 07:45:05, tương ứng với dữ liệu giờ 06:00 đến 07:00 ngày 10/01/2021 (pipeline hourly, path partition theo năm/tháng/ngày/giờ).

Câu hỏi yêu cầu xác định nguyên nhân có thể (possible cause) gây ra lỗi FileNotFound này. Đây là tình huống phổ biến trong ADF khi pipeline đọc dữ liệu từ ADLS Gen2 theo cấu trúc partition (Hive-style partitioning: year/month/day/hour), và lỗi chỉ xảy ra khi đường dẫn cụ thể không tồn tại. Kiến thức cập nhật đến 2026: ADF v2 (phiên bản mới nhất) hỗ trợ retry logic mặc định và error handling cho ADLS Gen2 qua connector AzureBlobStorage hoặc AzureDataLakeStorageGen2, với mã lỗi UserErrorFileNotFound chỉ ra vấn đề dữ liệu nguồn (không phải cấu hình).

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

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

Đáp án đúng: From 06:00 to 07:00 on January 10, 2021, there was no data in wwi/BIKES/CARBON.

Lý do 🛠️:

  • Lỗi PathNotFound rõ ràng chỉ ra đường dẫn partition year=2021/month=01/day=10/hour=06 không tồn tại trong filesystem wwi/BIKES/CARBON.
  • Pipeline hourly thường đọc dữ liệu của giờ trước đó (delayed processing), nên từ 06:00-07:00 không có dữ liệu mới được ingest vào ADLS Gen2 → path không được tạo.
  • Pipeline đã success 7 ngày trước, chứng tỏ vấn đề chỉ ở dữ liệu cụ thể này (không phải cấu hình pipeline hay parameter). Retries fail vì dữ liệu vẫn chưa có.

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

  • ❌ [SAI] The parameter used to generate year=2021/month=01/day=10/hour=06 was incorrect.
    Giải thích: Parameter generate path dựa trên hàm thời gian ADF như @formatDateTime(addhours(utcnow(), -1), 'yyyy/MM/dd/HH'), khớp chính xác với giờ trigger (khoảng 07:xx). Nếu sai, tất cả run trước sẽ fail, không chỉ run này. Lỗi là PathNotFound (file/folder không tồn tại), không phải parameter syntax.

  • ✅ [ĐÚNG] From 06:00 to 07:00 on January 10, 2021, there was no data in wwi/BIKES/CARBON.
    Giải thích: Như trên, đây là nguyên nhân trực tiếp. Không có dữ liệu ingest → path partition không tồn tại → ADF copy activity fail với UserErrorFileNotFound. Phổ biến trong streaming/ETL hourly khi nguồn dữ liệu gián đoạn.

  • ❌ [SAI] From 06:00 to 07:00 on January 10, 2021, the file format of data in wwi/BIKES/CARBON was incorrect.
    Giải thích: Lỗi PathNotFound xảy ra trước khi ADF đọc nội dung file (không tìm thấy path/folder). Nếu format sai (e.g., Parquet schema mismatch), lỗi sẽ là UserErrorFileTypeNotSupported hoặc BadFormat, không phải NotFound.

  • ❌ [SAI] The pipeline was triggered too early.
    Giải trợ: Pipeline đã chạy success 7 ngày (hourly), chứng tỏ trigger đúng. Retries 15 phút apart vẫn fail → không phải "too early" vì delay ingest thường >15p. Nếu early, dùng tumbling window trigger với delay/availability trong ADF để handle.

Khuyến nghị xử lý 🚀: Thêm fault tolerance trong ADF copy activity (skip incompatible files, log missing paths) hoặc monitor qua Azure Monitor + alert trên UserErrorFileNotFound. Kiểm tra upstream data pipeline (e.g., Azure Stream Analytics hoặc Event Hubs) để đảm bảo dữ liệu hourly đầy đủ.

Câu 170
You have an Azure Databricks workspace and an Azure Data Lake Storage Gen2 account named storage1.

New files are uploaded daily to storage1.

You need to recommend a solution that configures storage1 as a structured streaming source. The solution must meet the following requirements:

•Incrementally process new files as they are uploaded to storage1.
•Minimize implementation and maintenance effort.
•Minimize the cost of processing millions of files.
•Support schema inference and schema drift.

Which should you include in the recommendation?
  1. A COPY INTO
  2. B Azure Data Factory
  3. C Auto Loader
  4. D Apache Spark FileStreamSource
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 khuyến nghị giải pháp cấu hình Azure Data Lake Storage Gen2 (storage1) làm nguồn dữ liệu structured streaming trong môi trường Azure Databricks workspace. Các file mới được upload hàng ngày vào storage1, và giải pháp phải đáp ứng 4 yêu cầu chính 📋:

  • Incrementally process new files: Xử lý tăng dần chỉ các file mới upload, không xử lý lại toàn bộ dữ liệu cũ.
  • Minimize implementation and maintenance effort: Giảm thiểu công sức triển khai và bảo trì (dễ setup, tự động hóa cao).
  • Minimize the cost of processing millions of files: Giảm chi phí khi xử lý hàng triệu file (hiệu quả về tài nguyên compute/storage).
  • Support schema inference and schema drift: Hỗ trợ suy luận schema tự động và xử lý schema drift (thay đổi cấu trúc schema theo thời gian mà không cần can thiệp thủ công).

Đây là tình huống thực tế trong Azure Databricks (dựa trên Apache Spark), nơi cần streaming từ ADLS Gen2 với hiệu suất cao, chi phí thấp. Kiến thức cập nhật đến 2026: Auto Loader (phiên bản mới nhất trong Databricks Runtime 14.x+) là giải pháp tối ưu từ Databricks, tích hợp cloud-native cho ADLS Gen2.

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

✅ Đáp án đúng: Auto Loader

Lý do lựa chọn 🏆:
Auto Loader là giải pháp tối ưu nhất từ Databricks cho structured streaming từ ADLS Gen2. Nó sử dụng cloudFiles source để:

  • Incrementally process: Tự động phát hiện và xử lý chỉ file mới qua file notification (Azure Event Grid integration), tránh scan toàn bộ thư mục.
  • Minimize effort: Setup chỉ 1 dòng code (spark.readStream.format("cloudFiles")), tự động quản lý checkpoint, schema evolution.
  • Minimize cost: Xử lý hàng triệu file hiệu quả bằng parallel file discovery và micro-batch optimization, giảm compute bill lên đến 50-90% so với phương án khác (theo benchmark Databricks 2024).
  • Schema support: Hỗ trợ schema inference (tự suy luận schema lần đầu) và schema drift (merge schema thay đổi tự động với cloudFiles.schemaEvolutionMode).

Ví dụ code đơn giản:

spark.readStream.format("cloudFiles")
  .option("cloudFiles.format", "parquet")
  .load("abfss://container@storage1.dfs.core.windows.net/path")

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

  • COPY INTO ❌ Sai:
    Đây là lệnh SQL trong Databricks để batch load dữ liệu từ storage vào Delta table, không phải structured streaming. Nó không hỗ trợ incremental streaming real-time (chỉ chạy thủ công hoặc scheduled), yêu cầu scan toàn bộ file mỗi lần → tốn kém với millions files, không minimize effort/maintenance, và thiếu schema drift tự động. Phù hợp batch ETL hơn streaming.

  • Azure Data Factory ❌ Sai:
    ADF là ETL/orchestration tool ngoài Databricks, dùng cho pipeline data movement. Nó có thể trigger Databricks job nhưng không phải streaming source trực tiếp trong Databricks workspace. Không incremental real-time (dựa pipeline trigger), effort cao (setup pipeline riêng), chi phí ADF + Databricks cao với millions files, và schema inference/drift phải handle thủ công ở ADF/Databricks.

  • Auto Loader ✅ Đúng (như đã giải thích chi tiết ở trên): Hoàn hảo match tất cả requirements với kiến trúc cloud-optimized.

  • Apache Spark FileStreamSource ❌ Sai:
    Đây là file source gốc của Spark (spark.readStream.format("parquet").load()), hỗ trợ streaming cơ bản nhưng scan toàn bộ directory mỗi trigger → kém hiệu quả với millions files mới (tốn compute cao, chi phí lớn). Không tự động incremental notification, effort bảo trì cao (checkpoint thủ công), schema inference có nhưng không hỗ trợ schema drift tốt (phải config mergeLocation riêng). Auto Loader build trên nó nhưng optimized hơn.