Microsoft DP-203(Data Engineering on Microsoft Azure)1-10

A. データ ファクトリを公開する
B. プル リクエストを作成して変更を main ブランチにマージする
C. コードをリモート オリジンにプッシュする
D. プル リクエストを作成して変更を abc ブランチにマージする

回答
B. プル リクエストを作成して変更を main ブランチにマージする

Azure Data Factory の Git 連携では、ライブ環境へ公開する前にコラボレーション ブランチへ変更を統合する必要がある
機能ブランチ xyz の変更は直接公開できず、まず main ブランチへプル リクエストでマージ することでチーム共有状態となる。
その後に Publish 操作を実行するとライブ環境へ反映される。
したがって最初に行うべき操作は main へのマージであり、ブランチ戦略と公開フローの理解が重要である。
Azure Data Factory でのソース管理

回答
(下記画像参照)

WS1 からのコピーでは PolyBase を使用することで大規模データの並列ロードが可能 となり、最も高いパフォーマンスを実現できます。
一方で、P2 はテキスト形式のファイルを扱うため PolyBase は利用できず Bulk insert を使用する必要があります
この違いを理解することが重要であり、データ形式とロード方式の適合性が試験の重要ポイントです。
適切なコピー方式を選択することで Synapse の性能を最大化できます。
Azure Synapse Analytics とは

A. Azure Databricks
B. Azure Event Grid
C. Azure Stream Analytics
D. Azure Data Factory

回答
C. Azure Stream Analytics

リアルタイム処理と既存 C# コードの再利用が要件であるため、Azure Stream Analytics が最適です。
特に IoT Edge 上で実行する場合、C# のユーザー定義関数(UDF)を利用して既存ロジックを再利用できる点が重要です。
Databricks は主にバッチ・Spark 処理、Event Grid はイベント通知、Data Factory はバッチ統合向けであり要件に適合しません。
したがって、リアルタイム分析と C# 再利用の両立が可能な Stream Analytics が正解です。
IoT Edge での Azure Stream Analytics

回答
(下記画像参照)

大量ファイルを効率的に処理するには、フォルダーでの時間ベースのパーティション分割(Timeslice partitioning)が重要です。
これにより新規データのみを対象に読み込みでき、スキャン量を削減できます。
また形式は列指向で圧縮効率の高い Apache Parquetを使用することで、I/O とクエリ性能が向上します。
CSV や JSON は行指向のため非効率です。
したがって、時間パーティション+Parquet形式の組み合わせが最適解となります。
外部テーブルの作成と使用

回答
(下記画像参照)

サーバーレス SQL プールでは外部データ参照に CREATE EXTERNAL TABLE を使用して外部ストレージのデータを直接参照 します。
また、Parquet ファイルを読み込む際は OPENROWSET により Data Lake 上のファイルを直接クエリ する必要があります。
CROSS APPLY や OPENJSON は JSON 向け機能のため不適切です。
したがって、外部テーブル+OPENROWSET の組み合わせが正しい選択となります。
外部テーブルの作成と使用

A. すべてのデータを文字列として Parquet ファイルに保存する
B. OPENROWSET を使用して Parquet ファイルをクエリする
C. Parquet ファイルの列のサブセットを含む外部テーブルを作成する
D. ファイルに Snappy 圧縮を使用する

回答
C. Parquet ファイルの列のサブセットを含む外部テーブルを作成する

Parquet は列指向形式のため、必要な列だけを参照できる構成がコスト最適化に有効です。
外部テーブルで必要列のみに絞ることで、不要な列の読み取りや処理を減らし、サーバーレス SQL プールのスキャン量を抑制できます。
OPENROWSET は参照方法であり、保存コストそのものの最小化策ではありません。
試験では列指向形式の特性を活かした設計が重要です。
Synapse SQL で外部テーブルを使用する – Azure

回答
(下記画像参照)

このクエリの datarows はテーブル名ではなく OPENROWSET の結果セットに付ける別名 なので、テーブルは作成されません。
また、BULK パスの末尾にある /** はフォルダーを再帰的に走査してサブフォルダー内のファイルを対象 とします。
そのため、data 直下の file1 は対象外で、data/folder1/file1.csv は読み取られます。
試験では ワイルドカード指定と別名の意味 を区別して理解することが重要です。
サーバーレス SQL プールを使用して、フォルダーと複数のファイルに対してクエリを実行する – Azure Synapse Analytics | Microsoft Learn

A. 40
B. 240
C. 400
D. 2,400

回答
A. 40

専用 SQL プールでは 内部的に60分散(Distribution)に分割されるため、列ストアの最適圧縮には各パーティションあたり約100万行が推奨されます。
総レコード数24億件より、24億 ÷(100万 × 60)=40 となります。
パーティションが多すぎると1パーティションあたりの行数が減少し、列ストア圧縮効率とクエリ性能が低下します。
したがって、適切な粒度で分割する設計が重要であり、最適なパーティション数は40です。
専用 SQL プールのベスト プラクティス – Azure Synapse Analytics

回答
(下記画像参照)

10分ごとの最後のイベントを取得するには、MAX(Time) を使用して各ウィンドウ内の最新時刻を取得します。
また、ウィンドウは重複しない固定間隔が必要なため TumblingWindow を使用して時間単位で区切るのが適切です。
さらに、元データと結合する際は時間差を評価するため DATEDIFF 関数で時間範囲を指定します。
これにより、各ウィンドウ内の最終イベントを正確に抽出できます。
Azure Stream Analytics のウィンドウ関数

回答
(下記画像参照)

コスト最小化には冗長性を抑える必要があり、Locally-redundant storage(LRS)を選択することで最も低コストとなります。
また、365日経過後の自動削除には Azure Storage ライフサイクル管理を使用してポリシーで自動削除するのが最適です。
Automation Runbook は運用負荷が高く、Soft delete は削除防止機能のため要件に不適合です。
したがって、LRS+ライフサイクル管理の組み合わせが最適解です。
Azure Blob Storage のライフサイクル管理の概要